Почему табличная часть документа заполняется пустыми строками при выгрузке запроса в 1С:ЗУП 3.1?

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

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

Рассмотрим типовой сценарий, в котором возникает эта ошибка: в документе создается кнопка для отбора сотрудников по определенному реквизиту (например, статье затрат), формируется запрос к справочнику Справочник.Сотрудники, выгружается в таблицу значений и передается в табличную часть Объект.Начисления.Загрузить(...).

Причина ошибки: несовпадение имен колонок

Метод платформы ТабличнаяЧасть.Загрузить(ТаблицаЗначений) выполняет сопоставление колонок исключительно по их точному имени (идентификатору). Регистр символов при этом не учитывается, однако названия должны быть идентичными.

Если в запросе мы пишем конструкцию:


ВЫБРАТЬ
    Сотрудники.Ссылка
ИЗ
    Справочник.Сотрудники КАК Сотрудники

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

Решение 1: Использование псевдонимов в запросе

Самый простой и эффективный способ исправить поведение — задать псевдоним полю в тексте запроса с помощью ключевого слова КАК. Имя псевдонима должно в точности совпадать с именем реквизита табличной части.

Разберем по шагам правильную реализацию серверной процедуры:

  1. Вызываем метод выборки данных строго в серверном контексте (директива &НаСервере).
  2. Назначаем псевдоним КАК Сотрудник для поля ссылки.
  3. Корректно вызываем функции выполнения и выгрузки запроса: Запрос.Выполнить().Выгрузить() (со скобками вызова функций).
  4. Загружаем полученную таблицу в табличную часть Объект.Начисления.

Посмотрим на исправленный пример программного кода:


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

&НаКлиенте
Процедура ЗаполнитьПоСтатьеРасходов(Команда)
    ДляЗаполненияПоСтатьеРасходов();
КонецПроцедуры

Решение 2: Заполнение перебором выборки результата запроса

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


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

Особенности заполнения документа «Начисление зарплаты и взносов» в ЗУП 3.1

Проанализируем архитектурные ограничения прямого заполнения табличных частей расчетных документов в конфигурации «1С:Зарплата и управление персоналом 3.1»:

  1. Неполнота данных при вызове метода Загрузить(): Простое добавление строк с заполненным полем Сотрудник не выполняет расчет заработной платы. В строках будут отсутствовать виды расчетов, плановые показатели, отработанные дни и часы, тарифные ставки и суммы начислений.
  2. Связанные табличные части: Документ начисления зарплаты содержит несколько взаимосвязанных вкладок — ОтработанноеВремя, НДФЛ, Взносы, Удержания. Прямая загрузка только в одну табличную часть нарушает целостность документа и делает невозможным его корректное проведение.
  3. Использование типовых механизмов: Для полноценного расчета зарплаты по отобранному списку сотрудников рекомендуется формировать массив ссылок на сотрудников и передавать его в типовые процедуры пересчета модуля объекта/модуля менеджера документа либо использовать штатную форму подбора сотрудников.
← На главную