Описание проблемы
В статье речь идет о проблемах с печатью документа Транспортная накладная. Возможность оформления данных документов управляется соответствующей функциональной опцией – раздел Продажи.
Рассмотрим проблему печати на примере.
Имеется Транспортная накладная № 1, основанием к которой является Реализация товаров и услуг 1.
Имеется также Транспортная накладная № 2, основанием к которой является Реализация товаров и услуг 1 и, например, Реализация товаров № 2.
Надо сказать, что ситуация, когда один и тот же документ основание встречается в различных накладных, является вполне нормальной. Груз из одной накладной нередко перевозится в несколько этапов различными транспортными средствами.
У документа Транспортная накладная предусмотрено 2 типовых печатных формы Транспортная накладная (Приложение №4 к Правилам перевозок грузов автомобильным транспортом) и Товарно-транспортная накладная (Типовая межотраслевая форма № 1-Т)
Но при формировании печатной формы из ОДНОГО из документов (в нашем примере №1 или №2) к печати подготавливаются печатные формы одновременно ДВУХ (или большего количества) документов (в нашем примере №1 и №2).
Такая ситуация является нештатной, поскольку, повторюсь, запрашивался к печати только один из документов Транспортная накладная.
Указанная проблема выявляется для обоих видов печатных форм, при формировании по кнопке как из формы документа, так и из формы списка документов.
Исправление
Поскольку детальное исследование причин возникновения такой проблемы не будет интересно всем читателям, сразу скажу, что для исправления достаточно подключить небольшое расширение (назначение - Исправление). Может работать в безопасном режиме, то есть возможность применить это исправление и в 1С ФРЕШ.
Причины возникновение проблемы
Мне удалось выяснить, что причина такого нештатного поведения системы, в неправильном использовании входных переменных в следующей функции модуля менеджера документа ТранспортнаяНакладная:
Функция ПроверитьДокументыОснования(ПроверяемыеОбъекты, ВыделенныеСтрокиАдресов = Неопределено, ВыдаватьСообщения = Истина) Экспорт
Целью данной функции является формирование на выходе структуры(коллекции значений) результата, содержащей следующие ключи:
ОбъектыПоКоторымМожноИНужноСоздатьТранспортныеНакладные
ОбъектыПоКоторымСоздаватьТранспортныеНакладныеНельзя
ОбъектыПоКоторымНакладныеУжеСозданы
ЗаданияНаПеревозкуДляСозданияТранспортныхНакладных ЗаданияНаПеревозкуПоКоторымНакладныеУжеСозданы
Но это не так важно для данной статьи, поскольку в части формирования выходного значения проблем не выявлено.
А проблема совсем в другом.
Во входной параметр ПроверяемыеОбъекты в виде ссылки передается массив объектов печати (в понимании массива объектов всех процедур печати при использовании БСП). Заметим, что переменная передается, по ссылке, а не по значению!
Забыв про это, авторы проводят манипуляции с данной входной переменной. Например, используют прямое присваивание по ссылке новой переменной.
МассивОбъектов = ПроверяемыеОбъекты;
Напомню, что при этом новый массив не создается, а новая переменная лишь привязывается к существующим данным массива.
Далее в коде проводится обработка данных массива, включая такую операцию:
МассивОбъектов.Очистить();
При этом разработчики не учли, массив, связанный с входной переменной ПроверяемыеОбъекты так же будет очищен. А поскольку, как написано выше, переменная передается напрямую, а не в виде значения, входной массив, а это, на секундочку, список документов к печати, после выполнения функции массив оказывается пустым.
Достаточно было бы входную переменную было бы претворить выражением ЗНАЧ, такой бы проблемы не возникало:
Функция ПроверитьДокументыОснования(Знач ПроверяемыеОбъекты, ВыделенныеСтрокиАдресов = Неопределено, ВыдаватьСообщения = Истина) Экспорт
Возможно, возникает вопрос, почему проблема проявляется не всегда и вообще, как при этом хоть что-то печатается?
Кратко попробую ответить.
Данная функция, как писалось выше, на выходе формирует структуру с массивами документов-оснований.
По стандартной логике печати данные массивы сопоставляются с исходным массивом транспортных накладных к печати и каждому из транспортных накладных сопоставляются основания.
Когда печатается только один документ, имеющий оригинальное основание (которое не встречается в других транспортных накладных), печать проходит гладко, ведь функция подобрала основание, присутствующее только в данной накладной.
Но как только попадется основание, встречающееся в двух и более транспортных накладных, все они будут выведены на печать, поскольку «обрезающая функция» в виде сопоставления с исходным списком накладных к печати не отработает.
Первоначально проблема была обнаружена в 1С: Комплексная автоматизация 2.5.8.369.
Проверялось так же на последней 1С: Управление торговлей 11.5.8.405 - проблема на месте.
Предполагаю, что проблема проявится и в последних редакциях 1C: ERP.