Как добавить дополнительный реквизит способа отражения в документ "Отражение зарплаты в бухучете" в 1С:ЗУП 3.1

Программист 1С v8.3 (Управляемые формы) 1С:Зарплата и Управление Персоналом Бухгалтерский учет IT и автоматизация бизнеса
← На главную

При интеграции 1С:Зарплата и Управление Персоналом 3.1 (ЗУП) со сторонними (не 1С) бухгалтерскими программами часто возникает необходимость обогатить данные выгрузки дополнительной аналитикой. Например, пользователям требуется сопоставить способы отражения зарплаты в бухучете с конкретными номерами счетов дебета, кредита или субконто, которые затем должны быть выгружены в файл Excel. Для этого к справочнику СпособыОтраженияЗарплатыВБухУчете добавляют дополнительные реквизиты через механизм БСП (Библиотеки стандартных подсистем). Однако при попытке вывести эти реквизиты в табличную часть документа "Отражение зарплаты в бухучете" стандартными средствами платформы пользователи сталкиваются с трудностями.

В этой статье мы подробно разберем, почему типовой механизм настройки формы не решает эту задачу, проанализируем поведение платформы «1С:Предприятие 8.3» и рассмотрим три эффективных способа реализации данного требования: от самого безопасного (без изменения конфигурации) до визуального (с выводом колонок непосредственно на форму документа).

---

Почему типовым способом (через «Изменить форму») это сделать невозможно?

Для начала выясним причину, по которой стандартная кнопка «Еще» -> «Изменить форму» -> «Добавить поля» не позволяет вывести свойства способа отражения в табличную часть документа.

В платформе «1С:Предприятие 8.3» динамическое получение реквизитов связанных объектов "через точку" реализовано только для динамических списков (например, формы списков документов, справочников или реестров). Динамический список работает напрямую с базой данных через SQL-запросы, что позволяет платформе налету подтягивать связанные данные.

Табличная часть документа на форме представляет собой совершенно иной объект — ТаблицаФормы, связанная с источником данных типа ДанныеФормыКоллекция. Это физическая таблица значений, которая заполняется при открытии документа. Платформа не умеет динамически и без написания программного кода соединять строки таблицы формы со свойствами связанных ссылочных объектов.

Ситуация усложняется тем, что дополнительные реквизиты, созданные в режиме "1С:Предприятие", физически хранятся не в самом справочнике СпособыОтраженияЗарплатыВБухУчете, а во внешней табличной части этого справочника (механизм БСП) либо в специальном регистре сведений. Из-за такой архитектуры напрямую "через точку" получить эти данные на форме документа без программирования технически невозможно.

---

Способ 1. Реализация через расширение конфигурации (вывод колонок на форму)

Если для пользователей критически важно видеть счета Дт/Кт или иные дополнительные сведения визуально прямо в табличной части документа перед выгрузкой, наилучшим решением будет использование расширения конфигурации. Этот способ позволяет добавить колонки на форму и программно заполнить их, не снимая основную конфигурацию с поддержки.

Выполним задачу по шагам:

  1. Создадим новое расширение конфигурации в конфигураторе (меню Конфигурация -> Расширения конфигурации -> Добавить). Укажем назначение "Адаптация".
  2. Добавим в расширение документ ОтражениеЗарплатыВБухучете и его основную форму документа.
  3. В расширении откроем форму документа. Нам необходимо добавить новые реквизиты в табличную часть формы Начисления (или НачисленнаяЗарплатаИВзносы в зависимости от версии релиза). Обратите внимание: мы добавляем реквизиты только на форму (в коллекции данных формы), а не в сам физический документ базы данных. Это исключит раздувание базы данных и сохранит высокую скорость работы. Добавим реквизиты с именами, например, СчетДт_Форма и СчетКт_Форма с типом Строка (или ссылочным типом, если это необходимо).
  4. Перетащим созданные реквизиты на форму в элемент управления табличной части, чтобы они отображались в виде колонок.
  5. Теперь нам необходимо написать программный код для заполнения этих колонок при открытии документа и при изменении способа отражения в строке.

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

Рассмотрим пример программного кода для заполнения колонок формы:


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

КонецПроцедуры

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

---

Способ 2. Внешний отчет на СКД (Самый простой и безопасный способ)

Зачастую конечной целью вывода дополнительных реквизитов на форму является банальное сохранение таблицы в файл формата XLS (Excel) для последующего импорта в стороннюю систему. Если это ваш случай, то изменять форму документа и создавать расширения вовсе не обязательно. Намного проще и безопаснее с точки зрения последующих обновлений программы создать Внешний отчет на базе Системы компоновки данных (СКД).

Проанализируем преимущества этого подхода:

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


ВЫБРАТЬ
	ОтражениеНачисления.Ссылка КАК ДокументОтражения,
	ОтражениеНачисления.Сотрудник КАК Сотрудник,
	ОтражениеНачисления.Подразделение КАК Подразделение,
	ОтражениеНачисления.СпособОтражения КАК СпособОтражения,
	ОтражениеНачисления.Сумма КАК Сумма,
	ЕСТЬNULL(ДопРеквизитыДт.Значение, "Не указан") КАК СчетДт,
	ЕСТЬNULL(ДопРеквизитыКт.Значение, "Не указан") КАК СчетКт
ИЗ
	Документ.ОтражениеЗарплатыВБухучете.Начисления КАК ОтражениеНачисления
	
	// Присоединяем значение счета Дебета
	ЛЕВОЕ СОЕДИНЕНИЕ Справочник.СпособыОтраженияЗарплатыВБухУчете.ДополнительныеРеквизиты КАК ДопРеквизитыДт
		ПО ОтражениеНачисления.СпособОтражения = ДопРеквизитыДт.Ссылка
			И ДопРеквизитыДт.Свойство.Наименование = "Счет Дт"
			
	// Присоединяем значение счета Кредита
	ЛЕВОЕ СОЕДИНЕНИЕ Справочник.СпособыОтраженияЗарплатыВБухУчете.ДополнительныеРеквизиты КАК ДопРеквизитыКт
		ПО ОтражениеНачисления.СпособОтражения = ДопРеквизитыКт.Ссылка
			И ДопРеквизитыКт.Свойство.Наименование = "Счет Кт"
ГДЕ
	ОтражениеНачисления.Ссылка = &ДокументСсылка

В настройках СКД добавим параметр ДокументСсылка с типом ДокументСсылка.ОтражениеЗарплатыВБухучете, чтобы пользователь мог выбрать конкретный документ для формирования отчета. Полученную таблицу отчета бухгалтер сможет сохранить в формат XLS стандартной кнопкой «Сохранить как...» в 1С.

---

Способ 3. Внешняя обработка экспорта данных

Если принимающая сторонняя бухгалтерская программа требует файл строго определенной структуры (например, со специфическими заголовками колонок, определенным порядком столбцов или служебной XML/JSON-структурой), то простого сохранения отчета в Excel может оказаться недостаточно. В этом случае идеальным вариантом будет разработка Внешней обработки выгрузки.

Разберем по шагам логику работы такой обработки:

  1. Бухгалтер открывает обработку (ее можно зарегистрировать в базе через раздел "Дополнительные отчеты и обработки").
  2. На форме обработки выбирается необходимый документ "Отражение зарплаты в бухучете" и указывается путь для сохранения файла на диске.
  3. По кнопке "Выгрузить" обработка программно выполняет аналогичный вышеописанному SQL-запрос, считывает данные документа и связанных дополнительных реквизитов БСП.
  4. Программно создается COM-объект Excel или используется встроенный в 1С табличный документ для записи файла по строго заданному шаблону сторонней программы.
  5. Файл сохраняется на диск и полностью готов к загрузке без какой-либо ручной доработки пользователем.

---

Резюме: какой путь выбрать?

Подводя итог, выбор оптимального метода зависит исключительно от ваших конечных бизнес-требований:

← На главную