При формировании внешних и встроенных печатных форм в программе 1С разработчики и пользователи периодически сталкиваются с ситуацией, когда документ вместо одного экземпляра выводится сразу в двух или более копиях. При этом настройки печати на клиенте или параметры принтера показывают количество копий, равное единице. Выясним причину такого поведения и разберем по шагам, как локализовать и исправить данную ошибку.
Когда печатная форма неожиданно формирует лишние экземпляры, проанализируем основные факторы, способные вызвать такую проблему:
ТабличныйДокумент.КоличествоЭкземпляров.ПечатьДокументов в БСП) или настройка печати комплектов.Если в одной и той же базе по одной организации печатная форма выводится корректно в одном экземпляре, а по другой — в двух экземплярах при одинаковых настройках принтера, проблема кроется исключительно в данных и алгоритме их выборки в коде модуля.
Рассмотрим подробнее, почему изменение адреса или телефона организации приводит к дублированию документа. В типовых конфигурациях (таких как «1С:Управление торговлей», «1С:ERP», «1С:Комплексная автоматизация») контактная информация хранится в табличной части справочника Организации либо в специализированных регистрах сведений с поддержкой версионирования и истории изменений.
Если запрос печатной формы выполняет левое соединение к табличной части или регистру без строгой фильтрации и группировки, появление второй записи с аналогичным видом контактной информации (например, старого и нового адреса) приводит к тому, что результирующая выборка запроса удваивает строки шапки документа. В результате цикл вывода макета срабатывает дважды, формируя два полных комплекта документа в одном табличном документе.
Разберем методы корректного получения контактной информации без риска задвоения строк запроса.
Способ 1. Использование типового программного интерфейса БСП
Вместо прямых соединений с табличными частями организации в основном запросе печатной формы рекомендуется получать актуальные адреса и телефоны через стандартные функции подсистемы управления контактной информацией:
// Получение актуального представления адреса на дату документа
ВидАдреса = Справочники.ВидыКонтактнойИнформации.ЮрАдресОрганизации;
ПредставлениеАдреса = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъекта(
Шапка.Организация,
ВидАдреса,
Шапка.Дата
);
Способ 2. Корректировка текста запроса и группировка данных
Если контактная информация выбирается непосредственно в теле пакетного запроса, необходимо выделить выборку адресов в отдельный временный подзапрос с обязательной группировкой по ссылке и виду, либо использовать ключевое слово ВЫБРАТЬ РАЗЛИЧНЫЕ:
ВЫБРАТЬ
ОрганизацииКонтактнаяИнформация.Ссылка КАК Организация,
МАКСИМУМ(ОрганизацииКонтактнаяИнформация.Представление) КАК АдресПредставление
ПОМЕСТИТЬ ВТ_АдресаОрганизаций
ИЗ
Справочник.Организации.КонтактнаяИнформация КАК ОрганизацииКонтактнаяИнформация
ГДЕ
ОрганизацииКонтактнаяИнформация.Ссылка В(&МассивОрганизаций)
И ОрганизацииКонтактнаяИнформация.Вид = &ВидКонтактнойИнформации
И ОрганизацииКонтактнаяИнформация.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Адрес)
СГРУППИРОВАТЬ ПО
ОрганизацииКонтактнаяИнформация.Ссылка
;
Способ 3. Корректная работа со срезом последних при получении ответственных лиц
Аналогичные задвоения часто происходят при обращении к периодическим регистрам сведений, например, ОтветственныеЛицаОрганизаций или ФИОФизЛиц. При формировании виртуальной таблицы всегда передавайте дату документа в параметры среза, чтобы исключить выборку неактуальных записей:
ВЫБРАТЬ
ОтветственныеЛица.Организация КАК Организация,
ОтветственныеЛица.ФизическоеЛицо КАК Руководитель
ПОМЕСТИТЬ ВТ_Ответственные
ИЗ
РегистрСведений.ОтветственныеЛицаОрганизаций.СрезПоследних(&Период, Организация В (&МассивОрганизаций)) КАК ОтветственныеЛица
;
Если нет возможности оперативно изменить код внешней обработки, проверим данные организации непосредственно в режиме «1С:Предприятие»:
Справочник.Организации.КонтактнаяИнформация.