К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как отладить заполнение табличной части в 1С

Практическое руководство по отладке заполнения табличных частей в 1С: точки останова, отладчик, типовые ошибки в запросах и обходах строк, проверка результата.

Табличная часть — самое «хрупкое» место документа в 1С: строки либо не появляются вовсе, либо дублируются, либо заполняются не теми значениями. Причина почти всегда находится в одном из трёх мест: в источнике данных (запрос возвращает не то), в логике обхода (строки добавляются не тогда и не туда) или в событиях формы, которые молча перезаписывают результат.

Ниже — рабочий порядок действий: от подготовки отладки до проверки результата и разбора типовых ошибок. Материал ориентирован на встроенный язык 1С:Предприятие 8.3 и управляемые формы, но большинство приёмов применимо и к обычным формам.

Подготовка: включить отладку и найти нужную процедуру

Сначала убедитесь, что отладка вообще разрешена. В конфигураторе откройте «Сервис → Параметры» и проверьте настройки отладки, а для серверного режима убедитесь, что сервер 1С запущен с ключом отладки (для агента сервера — параметр -debug). Без этого точки останова на серверном коде просто не сработают, и вы будете искать ошибку там, где её «не видно».

Далее найдите процедуру, которая заполняет табличную часть. Типовые места: обработчик команды «Заполнить» в модуле формы документа, процедура ОбработкаЗаполнения в модуле объекта, обработчики ПриИзменении ключевых реквизитов (контрагент, договор, склад) и процедуры подбора. Быстрый способ — глобальный поиск (Ctrl+Shift+F) по имени табличной части, например Товары или Объект.Товары.

Проверка источника данных: запрос возвращает то, что нужно

Самая частая причина пустой табличной части — запрос-источник возвращает ноль строк, и цикл заполнения просто не выполняется ни разу. Прежде чем отлаживать цикл, убедитесь, что данные вообще приходят. Поставьте точку останова сразу после РезультатЗапроса = Запрос.Выполнить() и посмотрите в табло значение РезультатЗапроса.Пустой().

Если запрос пуст, проверьте параметры: откройте «Вычислить выражение» (Shift+F9) и посмотрите каждый параметр запроса — организация, дата, склад, ссылка на документ-основание. Типичная ситуация: в параметр передаётся пустая ссылка или дата без времени, и отбор отсекает все записи. Также проверьте виртуальные таблицы: остатки на дату документа могут быть нулевыми просто потому, что документ проводится «задним числом».

Для сложных запросов удобно скопировать текст запроса в консоль запросов (внешнюю обработку) и выполнить его с теми же параметрами отдельно. Это отделяет проблему «запрос неверен» от проблемы «код обработки результата неверен» — два разных класса ошибок, которые лечатся по-разному.

bsl
РезультатЗапроса = Запрос.Выполнить();
Если РезультатЗапроса.Пустой() Тогда
    // Точка останова здесь: смотрим параметры запроса
    Возврат;
КонецЕсли;
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
    НоваяСтрока = Объект.Товары.Добавить();
    ЗаполнитьЗначенияСвойств(НоваяСтрока, Выборка);
КонецЦикла;

Пошаговая отладка цикла заполнения строк

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

Обращайте внимание на условия внутри цикла: конструкции вида Если Выборка.Количество > 0 Тогда или фильтрация по признаку могут молча пропускать часть строк. Если строка в табличной части «потерялась», почти всегда найдётся условие, которое её отсекло. Полезно временно добавить счётчик пропущенных строк и вывести его после цикла — так вы увидите масштаб потерь.

Отдельный случай — повторный вызов заполнения. Если процедура не очищает табличную часть перед заполнением (Объект.Товары.Очистить()), при повторном нажатии кнопки строки задваиваются. Проверьте в отладчике количество строк до и после заполнения: Объект.Товары.Количество().

Порядок действий
  1. 1
    Включите отладку и поставьте точку останова в начале процедуры заполнения
  2. 2
    Воспроизведите действие пользователя: нажмите кнопку заполнения или измените реквизит-триггер
  3. 3
    Проверьте результат запроса-источника: РезультатЗапроса.Пустой() и параметры запроса
  4. 4
    Пройдите цикл по шагам, сверяя значения выборки и значения, попавшие в строку
  5. 5
    После цикла проверьте Объект.Товары.Количество() и содержимое первой и последней строки
  6. 6
    Снимите точки останова и повторите сценарий дважды, чтобы исключить задвоение строк

Отладка на форме: события, которые перезаписывают результат

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

Проверить это просто: поставьте точку останова в обработчике изменения и посмотрите стек вызовов (Ctrl+Alt+C). Если обработчик вызывается из процедуры заполнения, а не от действия пользователя, — значит, пересчёт выполняется дважды или с другими исходными данными. В типовых конфигурациях для управляемых форм программное заполнение часто оформляют так, чтобы обработчики изменения вызывались явно и в нужном порядке; проверьте, соблюдён ли этот порядок.

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

Контрольные точки

Как проверить результат

Количество строк после заполнения
Норма

Совпадает с количеством строк выборки запроса

Тревожный признак

Строк меньше — есть фильтрация в цикле; больше — нет очистки перед заполнением

Значения в первой строке
Норма

Совпадают с полями первой записи выборки

Тревожный признак

Значения пересчитаны обработчиками формы или взяты из другого источника

Повторное нажатие кнопки заполнения
Норма

Состав строк не меняется или полностью обновляется

Тревожный признак

Строки дублируются — процедура не очищает табличную часть

Типовые ошибки и как их распознать

Ошибка «пустая табличная часть при наличии данных» почти всегда означает проблему в параметрах запроса или в дате отбора остатков. Ошибка «не те значения в колонках» — несовпадение имён полей выборки и реквизитов табличной части при использовании ЗаполнитьЗначенияСвойств: поля с неподходящими именами просто молча пропускаются. Проверьте синонимы и имена через отладчик, сравнив состав полей выборки и колонок табличной части.

Ошибка «заполнение работает у разработчика и не работает у пользователя» указывает на права доступа: запрос к регистру или справочнику под пользователем с ограниченными правами (в том числе RLS) возвращает меньше строк или не возвращает ничего. Отладьте сценарий под пользователем с теми же правами — в конфигураторе можно запустить отладку от имени конкретного пользователя.

Типичные ошибки
01
Отладка только серверного кода без проверки обработчиков формы — итоговые значения перезаписываются после возврата на клиент
02
Проверка запроса с параметрами «из головы», а не с реальными значениями из отладчика — ошибка в параметре остаётся незамеченной
03
Забытая очистка табличной части перед заполнением — при повторном вызове строки задваиваются
04
Проверка под полными правами, тогда как у пользователя действуют ограничения RLS — в рабочей базе запрос возвращает меньше строк
05
Использование ЗаполнитьЗначенияСвойств без проверки совпадения имён полей — часть колонок остаётся пустой без какого-либо сообщения

Когда отладчика недостаточно: журнал регистрации и замеры

Если ошибка воспроизводится только в рабочей базе и не ловится в тестовой, добавьте временное логирование: запись в журнал регистрации через ЗаписьЖурналаРегистрации с ключевыми параметрами (пользователь, параметры запроса, количество строк выборки и результата). Это безопаснее, чем подключение отладчиком к рабочему серверу, где остановка на точке прерывания заблокирует сеанс пользователя.

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

Маршрут решения

Как выбрать действие

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

Итоговая проверка и границы самостоятельной работы

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

Самостоятельно безопасно работать в тестовой копии базы. Изменения в модуле объекта или формы рабочей конфигурации, особенно в типовой на поддержке, стоит согласовать с порядком обновления: доработки в типовых модулях усложнят последующие обновления. Если процедура заполнения находится в типовом коде, предпочтительный путь — расширение конфигурации, а не прямое изменение модуля.

Итог

Что важно запомнить

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

Частые вопросы

Почему точка останова в процедуре заполнения не срабатывает?

Чаще всего код выполняется на сервере, а сервер запущен без ключа отладки, либо в настройках конфигуратора не включён нужный тип отладки. Также проверьте, что вы отлаживаете тот же информационную базу, в которой воспроизводите действие, и что процедура действительно вызывается — иногда кнопка на форме привязана к другой команде.

ЗаполнитьЗначенияСвойств не заполняет часть колонок. В чём причина?

Метод сопоставляет свойства по именам. Если имя поля в запросе не совпадает с именем реквизита табличной части (например, в запросе «Номенклатура1», а в табличной части «Номенклатура»), такое поле молча пропускается. Используйте псевдонимы в запросе, совпадающие с именами колонок, либо заполняйте такие поля явно.

Как отладить заполнение при вводе документа на основании?

Поставьте точку останова в процедуре ОбработкаЗаполнения модуля объекта и создайте документ на основании нужного документа-источника. В параметре ДанныеЗаполнения будет ссылка на основание — проверьте, что отборы по ней в запросе корректны и исходный документ проведён, если запрос читает его движения.

Можно ли отладить заполнение без конфигуратора?

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

Почему в тестовой базе всё работает, а в рабочей — нет?

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

Как найти, откуда ещё вызывается заполнение табличной части?

Используйте глобальный поиск по имени процедуры заполнения и по имени табличной части во всей конфигурации, а во время отладки — стек вызовов (Ctrl+Alt+C): он покажет полную цепочку от действия пользователя до текущей строки кода, включая подписки на события и общие модули.