Ошибка «не заполнена колонка» при проведении документа в 1С: как найти причину

Проведение падает с сообщением о незаполненной колонке, а «Записать» проходит без ошибок? Разбираем, как отладчиком найти процедуру и строку, почему реквизиты «Цвет» и «Страна» не попадают в движения регистра, и даём чек-лист диагностики на 6 шагов.

Сообщение о незаполненной колонке при нажатии «Провести» появляется в коде, который выполняется только при проведении. Кнопка «Записать» сохраняет документ и вызывает проверку заполнения, а «Провести» дополнительно запускает процедуру ОбработкаПроведения и запись движений в регистры. Если проверка реквизитов или заполнение полей движения живёт в этом коде, при записи вы её не увидите.

Второй частый источник ошибки: запись набора записей регистра, где у реквизита включена проверка заполнения «Выдавать ошибку». Тогда платформа сама останавливает проведение, даже когда в табличной части документа значения есть. Автоподстановка в форме документа ничего не гарантирует: важно, что попало в набор записей на момент Движения.Записать().

Ниже разобран порядок поиска: остановка по ошибке в отладчике, чтение стека вызовов, сопоставление реквизитов табличной части и движений, проверка условий заполнения. Отдельно разбираем случай с реквизитами «Цвет» и «Страна», которые есть в регистре остатков, но не попадают в движения.

Почему «Записать» работает, а «Провести» выдаёт ошибку

Кнопки запускают разные ветки кода. Это ключ к пониманию ситуации: ищите не там, где вводили данные, а там, где документ обрабатывается.

Чем отличаются обработчики «Записать» и «Провести»

При записи платформа вызывает ОбработкаПроверкиЗаполнения (если в форме включено свойство «Проверять заполнение»), затем ПередЗаписью и ПриЗаписи. Документ уходит в базу, движения не формируются.

При проведении к этой цепочке добавляется ОбработкаПроведения. В ней разработчик размещает проверки и алгоритм заполнения движений: Движения.ОстаткиТоваров.Записывать = Истина;, обход строк табличной части, присвоение реквизитов и Движения.Записать(). Ошибка в этом блоке проявится только по кнопке «Провести».

Различие объясняет и поведение проверок. Условие, написанное прямо в ОбработкеПроведения, не сработает при записи. Проверка в ОбработкеПроверкиЗаполнения срабатывает в обеих операциях, если пользователь не отключил проверку заполнения в форме.

Где в 1С может возникать сообщение о незаполненной колонке

Типовые места, которые стоит проверить по порядку:

  • явная проверка в ОбработкеПроведения с текстом вида «Не заполнена колонка ...» и установкой Отказ = Истина;
  • запись набора записей регистра, где реквизит помечен как обязательный (свойство «Проверка заполнения» = «Выдавать ошибку»);
  • ОбработкаПроверкиЗаполнения, если проверка вызывает обработку проведения или дополнена условием по режиму работы;
  • ПередЗаписью и ПриЗаписи, где проверка зависит от данных, которые появляются только при проведении;
  • код формы: обработчики команд, ПриИзменении в табличной части, подбор номенклатуры, если сообщение формируется в событии формы, а не в модуле документа.

Текст сообщения часто уникален. Точная строка из окна сообщений ищется по конфигурации: в конфигураторе «Правка» → «Найти» (Ctrl+Shift+F по глобальному поиску или поиск в модулях). Если строка находится в типовом модуле, причина обычно в данных или в переопределённом обработчике расширения. Похожая логика разобрана в материале про ошибку «Реализовано меньше, чем возвращается»: там проверка в обработке проведения блокирует документ целиком, хотя данные в табличной части заполнены.

Как быстро найти причину с помощью отладчика

Отладчик экономит часы поиска по модулям. Остановка по ошибке ставит выполнение ровно на строку, которая сформировала сообщение.

Настройка остановки по ошибке в отладчике

  1. Откройте конфигуратор, меню «Сервис» → «Параметры» → вкладка «Отладка».
  2. Включите флажок «Останавливаться по ошибке». Для управляемых форм дополнительно проверьте настройку отладки клиентского и серверного контекста.
  3. Поставьте точку останова (F9) на строке с предполагаемой проверкой, если она известна заранее.
  4. Запустите «Отладка» → «Начать отладку» (F5) и воспроизведите действие: откройте документ, нажмите «Провести».
  5. При исключении отладчик остановится на строке, где вызвано сообщение или прервана запись.

Если ошибка не воспроизводится в отладке, проверьте журнал регистрации: там видно, в каком контексте и под каким пользователем выполнялось проведение. Приёмы работы с журналом и последствия аварийного завершения разобраны в статье про пропажу данных в 1С:Управление торговлей.

Чтение стека вызовов: как определить процедуру и строку

Окно «Стек вызовов» показывает цепочку вызовов сверху вниз. Верхняя строка, место возникновения исключения. Дальше идут процедуры, которые к ней привели, с именем модуля и номером строки.

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

Полезная привычка: в окне «Вычислить выражение» посмотреть значения переменных прямо в момент остановки. Проверьте СтрокаТЧ.Цвет, СтрокаТЧ.Страна, состав коллекции Движения и число добавленных строк. Часто выясняется, что движения вообще не добавлены, а сообщение возникло раньше, на проверке.

Проведение нередко запускается фоновым заданием, и пользователь видит только текст ошибки. Как отличить зависшее задание от упавшего проведения, разобрано в статье про зависшие фоновые задания в 1С.

Типичный случай: реквизиты «Цвет» и «Страна» не попадают в движения регистра

Ситуация: в регистре остатков есть реквизиты «Цвет» и «Страна», в табличной части документа они заполняются автоматически, но проведение падает или движения выходят с пустыми полями. Причина почти всегда в том, что код проведения не переносит эти значения в набор записей.

Анализ состава регистра и сопоставление с табличной частью

Откройте регистр накопления в конфигураторе и выпишите структуру: измерения, ресурсы, реквизиты. Отдельно отметьте, у каких полей стоит проверка заполнения «Выдавать ошибку». Дальше откройте модуль документа и найдите процедуру ОбработкаПроведения.

Сопоставьте списки попарно: колонка табличной части → поле движения. Проверьте три вещи: совпадение имён, совпадение типов (например, «Страна» как перечисление против справочника) и наличие присвоения вообще.

Процедура ОбработкаПроведения(Отказ, РежимПроведения)
    Движения.ОстаткиТоваров.Записывать = Истина;
    Для Каждого СтрокаТЧ Из Товары Цикл
        Движение = Движения.ОстаткиТоваров.Добавить();
        Движение.Период = Дата;
        Движение.Товар  = СтрокаТЧ.Номенклатура;
        Движение.Цвет   = СтрокаТЧ.Цвет;
        Движение.Страна = СтрокаТЧ.Страна;
    КонецЦикла;
КонецПроцедуры

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

Проверка условий заполнения перед записью движений

Значения могут присваиваться, но не доходить до движения из-за условия. Классический вариант:

Если ЗначениеЗаполнено(СтрокаТЧ.Цвет) Тогда
    Движение.Цвет = СтрокаТЧ.Цвет;
КонецЕсли;

Если на момент проведения поле пустое или условие собрано с ошибкой (сравнение с пустой строкой, проверка не того реквизита, инверсия), присвоение не выполнится. Второй вариант: цикл идёт по одной табличной части, а значения берутся из другой, либо отбор по виду номенклатуры отсекает нужные строки.

Третий вариант: движения пишутся в другой регистр или в другой набор, а смотрят на пустой. Проверьте, что выбран правильный объект в Движения.<ИмяРегистра> и что вызван Движения.Записать().

Явная проверка с понятным текстом ускоряет диагностику:

Если ПустаяСтрока(СтрокаТЧ.Страна) Тогда
    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = "Не заполнена колонка ""Страна"" в строке " + СтрокаТЧ.НомерСтроки;
    Сообщение.Сообщить();
    Отказ = Истина;
КонецЕсли;

Проверку стоит ставить до записи движений, чтобы не получить частично записанный набор. Текст сообщения делайте привязанным к строке табличной части: пользователь сразу увидит, где искать данные.

Пошаговый алгоритм диагностики ошибки

Порядок действий от быстрого к глубокому. Каждый шаг сужает область поиска.

Шаг 1: Локализация места ошибки

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

Шаг 2: Проверка данных и кода проведения

  1. Через отладчик посмотрите значения реквизитов табличной части до вызова проблемной процедуры.
  2. Сверьте состав и типы реквизитов регистра с полями, которые присваиваются в коде.
  3. Проверьте условия присвоения и отборы внутри цикла.
  4. Убедитесь, что набор записей инициализирован (Записывать = Истина) и записан.
  5. Посмотрите, не переопределяются ли значения в ПередЗаписью или ПриЗаписи.
  6. Проверьте настройки проверки заполнения у реквизитов документа и регистра.

Профилактика: как избежать подобных ошибок в будущем

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

Заполняйте движения по одному шаблону: инициализация набора, обход табличной части, присвоение всех полей из единого списка, запись. Если структура регистра меняется, список полей в коде обновляйте вместе с ней. Расхождение имён «Цвет» и «ЦветТовара» ищется долго, а находится за минуту, когда список сверен с конструктором движений.

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

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

Похожие статьи

Как в 1С КА 1.1 настроить зачёт валютного аванса при реализации нерезиденту и корректно отразить курсовые разницы

Курс аванса теряется в КА 1.1 из-за трёх настроек, и выручка считается по курсу отгрузки. В статье: чек-лист проверки договора и учётной политики, расчёт на цифрах, сверка проводок по счёту 62 и таблица отличий от КА 2.4. Настройте зачёт один раз и перестаньте ловить курсовые разницы по предоплате.

Как настроить открытие окон в 1С:Бухгалтерия 3.0, не отказываясь от интерфейса «Такси»

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

Как настроить проводки по НДФЛ для обособленных подразделений при обмене между ЗУП 3 и БП 3

Разбираем, почему при обмене ЗУП 3 и БП 3 НДФЛ по обособленным подразделениям уходит на 68.01.1 вместо 68.01.2, и показываем, что штатных настроек для этого нет. Три подхода к доработке с оценкой трудозатрат и влияния на обновления, плюс чек-лист проверки проводок на актуальных версиях.