"Вы всё сломали!". Разбираемся, кто прав, кто виноват

О том, как «всё испортил» программист, а на самом деле виноват заказчик.

Друзья и уважаемые мэтры 1С!

Скажу сразу: не судите меня строго… я плохо знаю БСП. Мой двухлетний опыт работы программистом пока не дал полностью ознакомиться с этим зверем. Но активно им пользуюсь. Не может пройти ни одной задачи, где я не использую модуль ОбщегоНазначения. Процедура ЗначениеРеквизитаОбъекта() и подобные — самые частоиспользуемые в моей практике. За то, что познакомили меня с этой библиотекой большое спасибо программистам-сеньорам, с которыми я работаю.

Статья, как и первая, имеет элементы художественного произведения, но и без технической части, конечно же, никак. Ладно, поехали.

Пришел как-то заказ сделать внешний отчет для УТ 11.4. Отчет не сложный: смотрит продажи, смотрит остатки, высчитывает среднее количество продаж за рабочий день, прогнозирует необходимое количество товара к заказу. Ну ок, сделал, в тест отдал. Через пару дней приходит письмо счастья: "Вы всё сломали!". На вопрос о том, что же сломалось, ответ меня, мягко говоря, удивил. Суть заключается в том, мой отчет сломал другой внешний отчет. Подключившись, я обнаружил картину Репина: нажимаю

 

 

А открывается:

 

 

То есть, схема компоновки — явно моего отчета, а вариант — от другого!

 

 

Ну что тут сказать, неожиданно… Отступление: если вы сразу поняли, в чем проблема, и если сейчас подумали, какой я нуб, то, в качестве оправдания, сошлюсь на первый абзац своего сочинения.

Итак, для начала я воспользовался первым законом программиста, который я выучил на первом месте работы (во франче): в любой непонятной ситуации чисти кэш. Неее, это было бы слишком легко:) Потом стал думать на хранилище вариантов настроек. Ещё и заказчик сказал, что в тестовой базе всё отлично работает. С хранилищем я тоже сильно не знаком, поэтому решил, что, если ничего больше не поможет, то приступлю к нему. В общем, приступил я к своему самому любимому методу поиска проблем — методу тыка:) Почему любимого? Потому что так очень много чего нового узнаешь.

Ладно, решил я найти старый доп. отчет, который полетел. Ищу, найти не могу. Спрашиваю заказчика — он тоже не знает. Ну ок, что поделать… Теперь ищу этот отчет в дереве отчетов, который можно открыть в любой подсистеме, к примеру в продажах, в меню "продажи/отчеты по продажам/ещё/все отчеты". Нахожу интересную ситуацию:

 

 

Очень любопытно… Пробую снять пометку удаления у неизвестного мне отчета "Ведомость по товарам" — нельзя. Элемент предопределенный.

Здесь я хочу объявить о новой рубрике: "Вопросы мэтрам". Итак, описываю ситуацию:

Хочу заставить принудительно снять пометку удаления. В настройках отладки ставлю остановку по ошибке. Останавливаюсь на команде ВызватьИсключение в обработчике ПередЗаписью. Ставлю точку останова на строке условия, из-за которого проваливаюсь в исключение. Дальше делаю так:

 

 

Теперь вопрос: можно ли так делать? То есть меня значения переменных прямо во время отладки. Штука-то удобная очень, в 8.2 такого нет.

Короче, получилось у меня снять пометку удаления, вышло следующее: появился третий вариант отчета) Только схема компоновки и настройки полностью совпадают с моим новым отчетом. А заголовок — от старого… Облом. Пробую зайти к проблеме с другого конца. Смотрим, что происходит при записи элемента справочника ДополнительныеОтчетыИОбработки. Отладкой проваливаемся в общий модуль ВариантыОтчетов, в процедуру ПриЗаписиДополнительногоОтчета. И вот оно! Тот самый запрос, который, показывает, где собака зарыта!

 

 

Справочник, Карл! В БСП есть справочник вариантов отчетов! Открываю форму список элементов через все функции (синоним этого справочника — "Отчеты"). После увиденного, все пазлы сошлись, но лучше от этого не стало. Вот она — форма списка справочника ВариантыОтчетов в пользовательском режиме:

 

 

Просветление!:) Только такой список никак не информативный… Ладно, пишу внешнюю обработку, вывожу на форму динамический список с колонками "Наименование" и "Отчет". Результат:

 

 

Нашел! Осталось всего-ничего — переопределить у вариантов отчетов "Ведомость по товарам" и "Ведомость по товарам и тому подобное" свойство Отчет на тот, которому эти варианты по факту принадлежат. Здесь мне пригодилась тестовая база заказчика, в которой всё было хорошо. Открыл свою обработку с динамическим списком, смотрим, что там есть:

 

 

Этот вариант принадлежал доп. отчету Ведомость по товарам. А теперь угадайте дальнейший расклад?:) Да, в тестовой базе отчет есть, а в рабочей — нету. Испарился чудесным образом (*сарказм*)! Оказалось, что заказчик случайно накатил на отчет Ведомость по товарам мой новый отчет. Отчет-то изменился, схема компоновки новая, а вот старые привязанные элементы справочника вариантов отчета пометились на удаление. Заказчик снял пометку удаления из варианта отчета, и это вылилось в то, что вы видели выше. В итоге осталось всего-ничего: Стащить из тестовой базы старый отчет, перезалить его в рабочую базу, переопределить пользовательский вариант отчета, удалить безвозвратно ненужный вариант. Всё это сделалось с помощью ещё одного реквизита формы и двух команд:

 

 

Код модуля формы:

 

&НаКлиенте
Процедура Переопределить(Команда)
ВариантОтчета = Элементы.ВариантыОтчетов.ТекущаяСтрока;
ПереопределитьНаСервере(ВариантОтчета, Отчет);
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ПереопределитьНаСервере(ВариантОтчета, Отчет)
УстановитьПривилегированныйРежим(Истина);
ВариантОбъект = ВариантОтчета.ПолучитьОбъект();
ВариантОбъект.Отчет = Отчет;
ВариантОбъект.Записать();
УстановитьПривилегированныйРежим(Ложь);
КонецПроцедуры

&НаКлиенте
Процедура УдалитьБезВозвратно(Команда)
ВариантОтчета = Элементы.ВариантыОтчетов.ТекущаяСтрока;
УдалитьБезВозвратноНаСервере(ВариантОтчета);
КонецПроцедуры

&НаСервереБезКонтекста
Процедура УдалитьБезВозвратноНаСервере(ВариантОтчета)
УстановитьПривилегированныйРежим(Истина);
ВариантОтчета.ПолучитьОбъект().Удалить();
УстановитьПривилегированныйРежим(Ложь);
КонецПроцедуры

Готово. Вот так оказалось, что "сломал" я, а виноват заказчик. Вывод: не перезаливайте отчет другим отчетом! Можно перезалить только более свежую версию текущего. Можно, конечно, попробовать написать какую-нибудь защиту, чтобы не давать перезаливать отчет, в котором отличаются идентификаторы вариантов. В связи с этим у меня вопрос к вам, уважаемые мэтры: эта ситуация — баг или фича?

Эту статью я писал по памяти, так как случилось эта ситуация достаточно давно. И снова прошу: не судите меня строго. Да, я не знаток 1С, я только учусь:)

26 Comments

  1. alex-l19041
    Оказалось, что заказчик случайно накатил на отчет …

    — да уж, лучше не давать заказчику это делать самостоятельно…

    Reply
  2. RomanCrow13

    (1) Да, это точно..:)

    Reply
  3. Sintson

    Заказчик оплатил затраченное на разбор время?

    Reply
  4. RomanCrow13

    (3) Нет, не платил.

    Reply
  5. AlX0id

    А надо ли было вообще все это расследовать?

    Если вопрос стоит как: «Вы все сломали!», то наверное стоило взять бэкап, когда все работало, самому накатить изменения — и сказать, что заказчик криворукий семичлен.

    Reply
  6. RomanCrow13

    (5) Возможно. Вопрос только в том, оплатил бы он тогда работу. Что с меня было взять: фрилансер, не юр. лицо, без предоплаты. Работал за ролтон)

    Reply
  7. AlX0id

    (6)

    Ну так работы-то было бы на порядок меньше.. Развернуть бэкап — делается силами заказчика, накатить обработку — 10 минут максимум.. Убедиться в различии результатов — 5 минут..

    Я, конечно, понимаю, что знал бы где упасть — соломки бы постелил.. Но все же..

    Reply
  8. Sintson

    (4)

    …И опыт, сын ошибок трудных,

    И гений, парадоксов друг…

    Reply
  9. akim2040

    Я тоже часто наступал на грабли с внешними отчетами.

    По поводу обнаруженного Вами справочника, можно было бы без всяких запросов. просто отобразить все поля формы. где сразу бы увидели и имена отчетов, и ключи вариантов

    Reply
  10. RomanCrow13

    (9) Ну да, моя решение совсем не лаконичное)

    Reply
  11. MikhailDr

    Ну тут и косяк разработчика, что не сделал все сам до конца, а дал залить отчет заказчику.

    Reply
  12. RomanCrow13

    (11) Дак у них есть свой штатный программист! Причём это он выступал контактным лицом заказчика. Конечно, были подозрения, что что-то не ладно. Мол, почему бы сам не сделал. Но подумал, что у самого много работы. Кто ж подумал, что так выйдет…

    Reply
  13. MikhailDr

    (12) Тогда конечно ясно

    Reply
  14. qwed557

    Надо самому до конца выполнять работу. А может сам залил в чужой отчет а тут написал что все сломал сам заказчик ))))

    Reply
  15. _MavR_

    Ну «штатному программисту» руки оторвать неплохо было бы, а потом пришить на более приличествующее им место 🙂

    Хотя конечно всякое в жизни бывает и не так еще можно накосячить по запарке.

    Reply
  16. RomanCrow13

    (14) может быть)) но доказывать точно ничего не буду.

    С тем, что нужно самому до конца доводить — согласен. Если работаешь с программистом, которого не знаешь, то доверять ему нельзя.

    В любом случае, это был полезный опыт. И интересно было узнать фичу БСП)

    Reply
  17. Fox-trot

    (16) погляди еще на параметр запуска «ЗапуститьОбновлениеИнформационнойБазы»»

    Reply
  18. bulpi

    Люди, которые работают с типовыми конфигурациями, с системой отчетов БСП и всем этим — глубоко несчастные люди. Даже если они этого не понимают.

    Reply
  19. severnyj

    (18)Типовые конфигурации придуманы для того чтобы в итоге перейти на нетиповые )

    Reply
  20. qwinter

    Столько проблем, а всего то надо было нажать кнопочку отключить и загрузить заново.

    Reply
  21. CratosX

    Меня тоже как-то подвело неудачное наименование команд «Загрузить» и «Создать». Создать — создаёт новый внешний отчет/обработку, а вот Загрузить — загружает в уже существующий элемент, на котором стоит активность в списке. Как-то затёр предыдущий отчёт, хорошо что было откуда его восстановить 🙂

    Вовсе не фича, а один из многочисленных багов

    Reply
  22. AlX0id

    (18)

    Да — найти спонсора который будет оплачивать время, которое тратится на очередную нетленку — это определенно счастье в наше время.

    Reply
  23. bulpi

    (22)

    Ну я же нахожу 🙂

    Reply
  24. olbir

    Зато опыт приобрел ) Это ценно

    Reply
  25. mrd_84

    (4)

    Не в деньгах счастье. Зато опыта нажил, нас научил)))

    Reply
  26. Abyss17

    История стара как мир, программист виноват ВО ВСЕМ априори.

    Заказчик светел и прекрасен и не может быть ни в чем виноват, потому что душа его девственна и не знает пороков, ибо он как ребенок чист и невинен в своих желаниях. Заказчик хочет чтобы ему было комфортно, но, как большинство маленьких детей, сформулировать свои желания не умеет. Поэтому сабж, не владея понятной аргументацией, использует то, что ему доступно — эмоции.

    С другой стороны, программисты — зачастую весьма прагматичные люди, и не каждый способен разглядеть рациональное звено в невнятных выкриках «инфанта».

    P.S. На всякий случай уточню, что вышеуказанная история про ПРОГРАММИСТОВ, а не про …кодеров, которые в своей работе используют «древнеиндусский» метод перебора всех возможных вариантов, пока не будет достигнут более менее приемлемый.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *