При интеграции 1С:Зарплата и Управление Персоналом 3.1 (ЗУП) со сторонними (не 1С) бухгалтерскими программами часто возникает необходимость обогатить данные выгрузки дополнительной аналитикой. Например, пользователям требуется сопоставить способы отражения зарплаты в бухучете с конкретными номерами счетов дебета, кредита или субконто, которые затем должны быть выгружены в файл Excel. Для этого к справочнику СпособыОтраженияЗарплатыВБухУчете добавляют дополнительные реквизиты через механизм БСП (Библиотеки стандартных подсистем). Однако при попытке вывести эти реквизиты в табличную часть документа "Отражение зарплаты в бухучете" стандартными средствами платформы пользователи сталкиваются с трудностями.
В этой статье мы подробно разберем, почему типовой механизм настройки формы не решает эту задачу, проанализируем поведение платформы «1С:Предприятие 8.3» и рассмотрим три эффективных способа реализации данного требования: от самого безопасного (без изменения конфигурации) до визуального (с выводом колонок непосредственно на форму документа).
---
Для начала выясним причину, по которой стандартная кнопка «Еще» -> «Изменить форму» -> «Добавить поля» не позволяет вывести свойства способа отражения в табличную часть документа.
В платформе «1С:Предприятие 8.3» динамическое получение реквизитов связанных объектов "через точку" реализовано только для динамических списков (например, формы списков документов, справочников или реестров). Динамический список работает напрямую с базой данных через SQL-запросы, что позволяет платформе налету подтягивать связанные данные.
Табличная часть документа на форме представляет собой совершенно иной объект — ТаблицаФормы, связанная с источником данных типа ДанныеФормыКоллекция. Это физическая таблица значений, которая заполняется при открытии документа. Платформа не умеет динамически и без написания программного кода соединять строки таблицы формы со свойствами связанных ссылочных объектов.
Ситуация усложняется тем, что дополнительные реквизиты, созданные в режиме "1С:Предприятие", физически хранятся не в самом справочнике СпособыОтраженияЗарплатыВБухУчете, а во внешней табличной части этого справочника (механизм БСП) либо в специальном регистре сведений. Из-за такой архитектуры напрямую "через точку" получить эти данные на форме документа без программирования технически невозможно.
---
Если для пользователей критически важно видеть счета Дт/Кт или иные дополнительные сведения визуально прямо в табличной части документа перед выгрузкой, наилучшим решением будет использование расширения конфигурации. Этот способ позволяет добавить колонки на форму и программно заполнить их, не снимая основную конфигурацию с поддержки.
Выполним задачу по шагам:
ОтражениеЗарплатыВБухучете и его основную форму документа.Начисления (или НачисленнаяЗарплатаИВзносы в зависимости от версии релиза). Обратите внимание: мы добавляем реквизиты только на форму (в коллекции данных формы), а не в сам физический документ базы данных. Это исключит раздувание базы данных и сохранит высокую скорость работы. Добавим реквизиты с именами, например, СчетДт_Форма и СчетКт_Форма с типом Строка (или ссылочным типом, если это необходимо).Перейдем в модуль формы документа в расширении и перехватим процедуру ПриЧтенииНаСервере или создадим обработчик ПриСозданииНаСервере. Нам нужно написать запрос, который выберет все способы отражения из табличной части документа, найдет для них значения дополнительных реквизитов и заполнит созданные нами колонки формы.
Рассмотрим пример программного кода для заполнения колонок формы:
&НаСервере
Процедура Расш1_ПриЧтенииНаСервереПосле(ТекущийОбъект)
// Получаем массив уникальных способов отражения из табличной части документа
МассивСпособов = Новый Массив;
Для Каждого СтрокаТЧ Из Объект.Начисления Цикл
Если ЗначениеЗаполнено(СтрокаТЧ.СпособОтражения) И МассивСпособов.Найти(СтрокаТЧ.СпособОтражения) = Неопределено Тогда
МассивСпособов.Добавить(СтрокаТЧ.СпособОтражения);
КонецЕсли;
КонецЦикла;
Если МассивСпособов.Количество() = 0 Тогда
Возврат;
КонецЕсли;
// Запросом выбираем значения дополнительных реквизитов для полученных способов отражения
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ДопРеквизиты.Ссылка КАК СпособОтражения,
| ДопРеквизиты.Значение КАК ЗначениеРеквизита,
| ДопРеквизиты.Свойство.Наименование КАК ИмяСвойства
|ИЗ
| Справочник.СпособыОтраженияЗарплатыВБухУчете.ДополнительныеРеквизиты КАК ДопРеквизиты
|ГДЕ
| ДопРеквизиты.Ссылка В(&МассивСпособов)
| И (ДопРеквизиты.Свойство.Наименование = ""Счет Дт"" ИЛИ ДопРеквизиты.Свойство.Наименование = ""Счет Кт"")";
Запрос.УстановитьПараметр("МассивСпособов", МассивСпособов);
РезультатЗапроса = Запрос.Выполнить();
// Соответствие для быстрого поиска параметров в памяти
ТаблицаДанных = РезультатЗапроса.Выгрузить();
// Заполняем колонки на форме документа
Для Каждого СтрокаФормы Из ЭтотОбъект.Элементы.Начисления.ИсточникиДанных.Начисления Цикл
// Производим поиск значений счетов для способа отражения в строке
ПараметрыОтбора = Новый Структура;
ПараметрыОтбора.Вставить("СпособОтражения", СтрокаФормы.СпособОтражения);
// Ищем Счет Дт
ПараметрыОтбора.Вставить("ИмяСвойства", "Счет Дт");
НайденныеСтрокиДт = ТаблицаДанных.НайтиСтроки(ПараметрыОтбора);
Если НайденныеСтрокиДт.Количество() > 0 Тогда
СтрокаФормы.СчетДт_Форма = НайденныеСтрокиДт[0].ЗначениеРеквизита;
КонецЕсли;
// Ищем Счет Кт
ПараметрыОтбора.Свойство("ИмяСвойства", "Счет Кт");
НайденныеСтрокиКт = ТаблицаДанных.НайтиСтроки(ПараметрыОтбора);
Если НайденныеСтрокиКт.Количество() > 0 Тогда
СтрокаФормы.СчетКт_Форма = НайденныеСтрокиКт[0].ЗначениеРеквизита;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Этот способ позволяет пользователям визуально контролировать заполненные счета учета непосредственно на форме документа 1С. Однако помните, что при изменении способа отражения пользователем вручную в строке документа, необходимо также предусмотреть обработчик события ПриИзменении для поля СпособОтражения, чтобы динамически обновлять счета на клиенте.
---
Зачастую конечной целью вывода дополнительных реквизитов на форму является банальное сохранение таблицы в файл формата XLS (Excel) для последующего импорта в стороннюю систему. Если это ваш случай, то изменять форму документа и создавать расширения вовсе не обязательно. Намного проще и безопаснее с точки зрения последующих обновлений программы создать Внешний отчет на базе Системы компоновки данных (СКД).
Проанализируем преимущества этого подхода:
Для реализации этого способа создадим внешний отчет и в схеме компоновки данных напишем запрос, который связывает табличную часть документа ОтражениеЗарплатыВБухучете с табличной частью дополнительных реквизитов справочника способов отражения. Посмотрим на пример такого запроса:
ВЫБРАТЬ
ОтражениеНачисления.Ссылка КАК ДокументОтражения,
ОтражениеНачисления.Сотрудник КАК Сотрудник,
ОтражениеНачисления.Подразделение КАК Подразделение,
ОтражениеНачисления.СпособОтражения КАК СпособОтражения,
ОтражениеНачисления.Сумма КАК Сумма,
ЕСТЬNULL(ДопРеквизитыДт.Значение, "Не указан") КАК СчетДт,
ЕСТЬNULL(ДопРеквизитыКт.Значение, "Не указан") КАК СчетКт
ИЗ
Документ.ОтражениеЗарплатыВБухучете.Начисления КАК ОтражениеНачисления
// Присоединяем значение счета Дебета
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.СпособыОтраженияЗарплатыВБухУчете.ДополнительныеРеквизиты КАК ДопРеквизитыДт
ПО ОтражениеНачисления.СпособОтражения = ДопРеквизитыДт.Ссылка
И ДопРеквизитыДт.Свойство.Наименование = "Счет Дт"
// Присоединяем значение счета Кредита
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.СпособыОтраженияЗарплатыВБухУчете.ДополнительныеРеквизиты КАК ДопРеквизитыКт
ПО ОтражениеНачисления.СпособОтражения = ДопРеквизитыКт.Ссылка
И ДопРеквизитыКт.Свойство.Наименование = "Счет Кт"
ГДЕ
ОтражениеНачисления.Ссылка = &ДокументСсылка
В настройках СКД добавим параметр ДокументСсылка с типом ДокументСсылка.ОтражениеЗарплатыВБухучете, чтобы пользователь мог выбрать конкретный документ для формирования отчета. Полученную таблицу отчета бухгалтер сможет сохранить в формат XLS стандартной кнопкой «Сохранить как...» в 1С.
---
Если принимающая сторонняя бухгалтерская программа требует файл строго определенной структуры (например, со специфическими заголовками колонок, определенным порядком столбцов или служебной XML/JSON-структурой), то простого сохранения отчета в Excel может оказаться недостаточно. В этом случае идеальным вариантом будет разработка Внешней обработки выгрузки.
Разберем по шагам логику работы такой обработки:
---
Подводя итог, выбор оптимального метода зависит исключительно от ваших конечных бизнес-требований: