Как исправить ошибку «Не найден внешний набор данных НачисленияУдержанияДокумента» в 1С:ЗУП после обновления?

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

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

В этой статье мы подробно разберем, почему после обновления конфигурации (например, при переходе с ветки 3.1.2 на 3.1.5 и выше) внешняя обработка или отчет внезапно прекращает формирование данных и вылетает со строгой системной ошибкой: «Не найден внешний набор данных НачисленияУдержанияДокумента». Мы выясним глубинную причину этой проблемы, проанализируем архитектурные изменения в логике «1С» и рассмотрим пошаговые инструкции по исправлению ситуации как для разработчиков, так и для рядовых пользователей системы.

Почему возникает ошибка: анализируем архитектурные изменения в ЗУП 3.1

Для начала давайте разберемся, из-за чего возник этот сбой. Начиная с версий 3.1.4 и 3.1.5, фирма «1С» провела глубокую реструктуризацию внутренних механизмов формирования отчетов по заработной плате. Под раздачу попали такие ключевые и самые популярные отчеты, как «Расчетный листок», «Анализ начислений и удержаний», «Расчетная ведомость» и другие.

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

Теперь данные собираются и подготавливаются программно в недрах общих модулей конфигурации, после чего они передаются в СКД в качестве внешних наборов данных (наборы данных с типом Объект). Одним из таких новых обязательных наборов данных и стал набор с именем НачисленияУдержанияДокумента. Он функционирует в паре с базовым набором НачисленияУдержания и отвечает за детальную расшифровку всех расчетов в разрезе документов-регистраторов.

Если ваша внешняя обработка или отчет используют механизмы СКД, заимствованные из старой версии ЗУП, или напрямую вызывают общие модули конфигурации для заполнения источников данных, то возникает жесткий конфликт интересов:

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

Шаг 1. Локализуем проблему с помощью отладчика

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

Разберем по шагам процесс настройки отладки:

  1. Откройте базу данных в режиме Конфигуратора.
  2. В главном меню перейдите в раздел Отладка -> Настройка отладки... и убедитесь, что у вас включена возможность отладки на сервере (особенно если вы работаете в клиент-серверном варианте базы данных). Если база серверная, проверьте, запущен ли агент службы «1С:Предприятия» с ключом -debug.
  3. В меню Отладка выберите пункт Остановка по ошибке. Установите флажок напротив пункта Останавливаться по ошибке. Это позволит конфигуратору автоматически переключить фокус на строку программного кода, которая инициирует аварийное завершение процесса.
  4. Запустите сеанс работы в режиме 1С:Предприятие (нажав клавишу F5), откройте проблемную внешнюю обработку и запустите процедуру выгрузки или формирования.

При возникновении ошибки отладчик автоматически остановит выполнение кода. Как правило, остановка происходит в модуле объекта обработки или общем модуле на строке инициализации процессора компоновки данных:


ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных, ВнешниеНаборыДанных, ДанныеРасшифровки);

В этот момент мы можем детально исследовать переменную ВнешниеНаборыДанных. Это коллекция типа Структура. Обратите внимание, какие ключи содержатся в этой структуре и сопоставьте их со списком наборов данных в вашей схеме компоновки данных.

Шаг 2. Адаптируем внешнюю обработку под новые требования (Решение для разработчика)

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

Рассмотрим подробнее два сценария решения этой проблемы.

Сценарий А. Если схема компоновки данных находится внутри внешней обработки

Если ваш отчет или обработка использует собственный макет СКД, нам потребуется выполнить следующие действия:

  1. Откройте внешнюю обработку в Конфигураторе, перейдите к макетам и откройте основную схему компоновки данных.
  2. Перейдите на вкладку Наборы данных.
  3. Проверьте, присутствует ли в списке наборов данных набор типа «Объект» с именем НачисленияУдержанияДокумента. Если его там нет, его необходимо добавить. Убедитесь, что имя набора данных в точности совпадает с ожидаемым системой.
  4. Далее переходим к модулю обработки, где происходит программная инициализация компоновки. Нам нужно принудительно добавить пустую или заполненную таблицу значений в структуру внешних источников. Проанализируем пример кода:

// Создаем структуру для передачи внешних наборов данных
ВнешниеНаборыДанных = Новый Структура;

// Допустим, у нас уже формируется основная таблица начислений
ТаблицаНачислений = ПолучитьТаблицуНачислений(); 
ВнешниеНаборыДанных.Вставить("НачисленияУдержания", ТаблицаНачислений);

// Решаем проблему: создаем и инициализируем структуру для нового набора данных
// В простейшем случае, если детальная информация по регистраторам не требуется,
// мы можем передать пустую таблицу с аналогичной структурой колонок
ТаблицаДокументов = ТаблицаНачислений.СкопироватьКолонки();
ВнешниеНаборыДанных.Вставить("НачисленияУдержанияДокумента", ТаблицаДокументов);

// Инициализируем процессор компоновки без ошибок
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных, ВнешниеНаборыДанных, ДанныеРасшифровки);

Сценарий Б. Использование типовых программных механизмов конфигурации

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

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


// Для автоматического сбора всех необходимых таблиц (включая НачисленияУдержанияДокумента)
// используем вызов типового метода конфигурации ЗУП
ПараметрыОтчета = Новый Структура;
// Заполняем параметры отчета (период, организация, сотрудники и т.д.)
ПараметрыОтчета.Вставить("НачалоПериода", ПериодРегистрации);
ПараметрыОтчета.Вставить("КонецПериода", КонецПериода(ПериодРегистрации, "Месяц"));

// Вызываем метод типовой конфигурации для подготовки всех источников данных
ДанныеОтчета = ЗарплатаКадрыОбщиеНаборыДанных.ЗаполнитьОбщиеИсточникиДанныхОтчета(ПараметрыОтчета);

// Теперь структура "ДанныеОтчета" гарантированно содержит все требуемые таблицы,
// включая искомый набор "НачисленияУдержанияДокумента"
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных, ДанныеОтчета, ДанныеРасшифровки);

Такой подход защитит вашу обработку от будущих обновлений конфигурации, поскольку всю грязную работу по формированию структуры таблиц берет на себя сама система 1С.

Что делать, если ошибка возникла в стандартном отчете (Решение для пользователей и администраторов)

Бывают ситуации, когда точно такая же ошибка («Не найден внешний набор данных НачисленияУдержанияДокумента») возникает при формировании типовых, не измененных отчетов после рядового обновления базы данных. Например, при попытке сформировать отчет «Анализ зарплаты по сотрудникам» или расчетные листки.

Это происходит по причине конфликта старых кэшированных пользовательских настроек со структурой новой конфигурации. Давайте разберем три шага для быстрого исправления этой проблемы:

Способ 1. Сброс настроек отчета к стандартным

В большинстве случаев это самое быстрое и эффективное решение. Пользователю не требуются права программиста.

  1. Откройте форму отчета, при формировании которого возникает ошибка.
  2. В верхнем правом углу нажмите кнопку Еще.
  3. В выпадающем меню выберите пункт Установить стандартные настройки (в некоторых интерфейсах этот пункт называется Стандартные настройки).
  4. Попробуйте сформировать отчет заново. Система принудительно перечитает актуальную схему компоновки из метаданных и конфликт имен исчезнет.

Способ 2. Очистка кэша платформы «1С:Предприятие»

Если сброс настроек внутри программы не помог, вероятно, платформа сохранила старое представление схемы компоновки данных в локальном кэше на компьютере пользователя.

  1. Полностью закройте все сеансы работы с программами «1С».
  2. Запустите окно запуска «1С:Предприятия».
  3. Выберите нужную информационную базу из списка и нажмите кнопку Изменить....
  4. Нажимайте кнопку «Далее» до последней страницы настроек. В поле Дополнительные параметры запуска впишите параметр: /ClearCache.
  5. Нажмите кнопку Готово и запустите базу данных. При первом запуске платформа очистит кэш метаданных, что решит проблему неактуальных схем данных. После успешного запуска этот параметр из строки запуска можно удалить.

Способ 3. Проведение тестирования и исправления базы данных

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

  1. Обязательно создайте резервную копию базы данных перед проведением любых технических работ!
  2. Запустите базу данных в режиме Конфигуратора.
  3. В меню Администрирование выберите пункт Тестирование и исправление....
  4. Установите флажки напротив пунктов Реиндексация таблиц информационной базы, Проверка логической целостности и Проверка ссылочной целостности.
  5. Нажмите кнопку Выполнить и дождитесь завершения процедуры.

Мы детально проанализировали проблему, нашли ее корни в архитектуре обновления 1С:ЗУП 3.1 и рассмотрели комплексные методы борьбы с ошибкой отсутствия внешних наборов данных. Своевременное обновление кода ваших обработок и регулярная профилактика кэша гарантируют стабильную и быструю работу вашей учетной системы.

← На главную