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