Изменение строк в документах 1С: вручную, обработкой и кодом

· 9 мин

Содержание

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

Прямая правка таблиц через SQL и «обновление через консоль запросов» не работают так, как ожидают: язык запросов 1С данные только читает, а SQL обходит всю логику программы. Ниже по порядку — от безопасного к рискованному. Всё описанное относится к платформе 8.3 и типовым конфигурациям на управляемых формах (БП 3.0, УТ 11, ЗУП 3.1).

Какой способ обновления табличной части выбрать

Слово «обновить» здесь означает разные задачи. Перезаполнить строки по новым данным. Заменить значение в колонке. Удалить лишние строки. Или просто перечитать форму, чтобы увидеть чужие изменения. От задачи зависит инструмент.

СпособКогда подходитРиски
Ручная правка в форме1–10 документов, разные правкиОпечатки, забытое перепроведение
Групповое изменение реквизитовОдно значение во многих документахМеньше гибкости в условиях по строкам
Внешняя обработкаПравка строк по условию, сотни документовОшибка в коде затронет все документы
Код в форме документаДоработка конфигурации, кнопка для пользователейНужен Конфигуратор или расширение
SQL напрямуюНе рекомендуетсяРегистры и итоги не пересчитаются
Что нужно сделать со строками?

Как обновить табличную часть документа вручную в форме

Ручной путь самый безопасный: все обработчики формы срабатывают, суммы и НДС пересчитываются сами.

Перезаполнение строк

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

Кнопка «Подбор» добавляет строки к существующим, ничего не удаляя. Ей удобно дополнять документ, когда основная часть уже введена.

Правка нескольких строк сразу

  1. Выделите строки мышью с зажатым Ctrl (по одной) или Shift (диапазон).
  2. Выделите всю табличную часть сочетанием Ctrl+A.
  3. Скопируйте строки Ctrl+C и вставьте Ctrl+V — так быстро переносят строки между двумя документами одного вида.
  4. Удалите выделенные строки клавишей Delete.

Колонку с одинаковым значением, например ставку НДС или счёт учёта, удобнее менять обработкой из следующего раздела: вручную правка каждой строки на 200 позиций займёт полчаса.

Загрузка из файла

В БП 3.0 и УТ 11 у табличной части «Товары» в большинстве документов есть команда загрузки из файла — кнопка «Загрузить» или пункт в меню Ещё. Она принимает таблицу Excel, сопоставляет колонки и строки с номенклатурой. Так обновляют длинный список, когда новые цены и количества пришли от поставщика в файле.

Перечитать документ

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

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

Групповое изменение реквизитов и другие типовые обработки

В типовых конфигурациях на БСП есть обработка «Групповое изменение реквизитов». В БП 3.0 она лежит в разделе Администрирование → Обслуживание → Корректировка данных. Быстрее вызвать её из списка документов:

  1. Откройте журнал нужного вида документов, например «Реализация (акты, накладные)».
  2. Установите отбор по периоду или контрагенту.
  3. Выделите нужные документы (Ctrl+A — все в отборе).
  4. В меню Ещё выберите команду изменения выделенных.
  5. Отметьте реквизит, задайте новое значение и нажмите «Изменить реквизиты».

В актуальных версиях обработки можно выбрать и колонки табличных частей. Значение тогда ставится во все строки выбранных документов. Если нужно менять строки по условию — например, только строки с конкретной номенклатурой — возможностей обработки не хватит.

💡 После группового изменения перепроведите затронутые документы обработкой «Групповое перепроведение документов» (раздел Операции). Так регистры и проводки придут в соответствие с новыми строками.

Для старых конфигураций на обычных формах (платформа 8.2) использовали универсальную обработку «Групповая обработка справочников и документов» с диска ИТС. На управляемых формах 8.3 её заменяет обработка из БСП.

Внешняя обработка: программное обновление табличной части документов

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

Перед запуском сделайте резервную копию базы (выгрузку в .dt или копию каталога файловой базы). Ошибка в коде за секунды испортит все отобранные документы.

Пример: заменить одну номенклатуру на другую в реализациях за период и перепровести их. Код выполняется на сервере.

&НаСервере
Процедура ЗаменитьНоменклатуруНаСервере()

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

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

        Режим = ?(ДокОбъект.Проведен,
            РежимЗаписиДокумента.Проведение,
            РежимЗаписиДокумента.Запись);
        Попытка
            ДокОбъект.Записать(Режим);
        Исключение
            Сообщить(СтрШаблон("%1: %2", Строка(Выборка.Ссылка), ОписаниеОшибки()));
        КонецПопытки;
    КонецЦикла;

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

Здесь СтараяНоменклатура, НоваяНоменклатура, ДатаНачала и ДатаОкончания — реквизиты самой обработки. Запрос отбирает только документы, где строка реально есть, а не перебирает все реализации подряд.

Как прогнать обработку без риска

  1. Разверните копию рабочей базы: загрузите свежую выгрузку .dt в новую пустую базу.
  2. Запустите обработку на копии с узким отбором — один день или один контрагент.
  3. Откройте два-три изменённых документа и сравните строки, суммы и проводки с исходными.
  4. Сформируйте оборотно-сальдовую ведомость по затронутым счетам до и после правки.
  5. Только после этого запускайте обработку в рабочей базе на полный период.

Сообщения из блока Исключение сохраните: в них список документов, которые не записались. Их обычно немного, и проще поправить вручную.

Полезные методы табличной части

  • 🔹 Добавить() — новая строка, возвращает её для заполнения.
  • 🔹 Удалить(Строка) — удаляет строку.
  • 🔹 Очистить() — удаляет все строки.
  • 🔹 НайтиСтроки(Структура) — массив строк по условию.
  • 🔹 Выгрузить() и Загрузить(ТаблицаЗначений) — перенос в таблицу значений и обратно.

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

Нулевые = ДокОбъект.Товары.НайтиСтроки(Новый Структура("Количество", 0));
Для Каждого Стр Из Нулевые Цикл
    ДокОбъект.Товары.Удалить(Стр);
КонецЦикла;

Чтобы схлопнуть повторяющиеся строки, выгрузите табличную часть, сверните и загрузите обратно:

ТЗ = ДокОбъект.Товары.Выгрузить();
ТЗ.Свернуть("Номенклатура, Цена", "Количество, Сумма");
ДокОбъект.Товары.Загрузить(ТЗ);

Колонки таблицы значений должны называться так же, как реквизиты табличной части. Колонки, не указанные в Свернуть(), исчезнут, и в документе эти поля станут пустыми. В реальном документе добавьте в список все нужные колонки: ставку НДС, сумму НДС, счета учёта.

Запись без обработчиков

Иногда нужно поправить поле, которое не влияет на учёт, и не запускать долгие проверки. Для этого перед записью ставят ДокОбъект.ОбменДанными.Загрузка = Истина и пишут в режиме РежимЗаписиДокумента.Запись. Обработчики ПередЗаписью и проверки конфигурации тогда пропускаются.

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

Обновление строк из кода формы документа

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

В управляемой форме данные документа лежат в реквизите Объект. Его табличную часть можно менять прямо на клиенте или на сервере:

&НаСервере
Процедура УстановитьСкладВоВсехСтрокахНаСервере(Склад)
    Для Каждого Стр Из Объект.Товары Цикл
        Стр.Склад = Склад;
    КонецЦикла;
    Модифицированность = Истина;
КонецПроцедуры

Форма обновится сама после возврата с сервера. Документ пока не записан: пользователь увидит изменения и решит, проводить его или нет. Имя колонки Склад условное — в конкретном документе сверьте имена реквизитов в Конфигураторе.

Когда нужны методы модуля объекта, переведите данные формы в объект и обратно:

ДокОбъект = РеквизитФормыВЗначение("Объект");
ДокОбъект.ЗаполнитьПоОснованию(...); // любой метод модуля объекта
ЗначениеВРеквизитФормы(ДокОбъект, "Объект");

Для текущей строки на клиенте используют Элементы.Товары.ТекущиеДанные — это данные строки, на которой стоит курсор.

Консоль запросов и SQL: что можно, а что нельзя

Консоль запросов — внешняя обработка для чтения данных. Язык запросов 1С умеет только выбирать: команд изменения строк в нём нет. Поэтому консоль помогает найти документы, которые надо исправить, но сама ничего не обновляет. Текст запроса из консоли переносят во внешнюю обработку — как в примере выше.

Прямая правка таблиц в MS SQL или PostgreSQL технически возможна для клиент-серверной базы. Табличные части хранятся в отдельных таблицах вида _Document123_VT456, поля называются _Fld…. Соответствие имён объектам 1С показывает функция ПолучитьСтруктуруХраненияБазыДанных().

Почему так делать не стоит:

  • ❌ не пересчитываются движения, регистры и итоги — отчёты разойдутся с документами;
  • ❌ не срабатывают проверки, блокировки и история изменений;
  • ❌ легко нарушить ссылочную целостность и получить «битые» ссылки;
  • ❌ фирма 1С такие изменения не поддерживает, а файловая база через SQL недоступна вообще.

Если строки всё же правили в SQL, перепроведите документы средствами 1С и запустите тестирование и исправление в Конфигураторе. Для тестирования нужен монопольный доступ — пользователей придётся вывести из базы.

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

Диагностика: выберите симптом

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

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

Можно ли поменять строки проведённого документа без отмены проведения?
Да. Измените строки и нажмите «Провести»: движения перестроятся по новым данным. Отменять проведение заранее не нужно.
Сохранятся ли ручные правки после кнопки «Заполнить»?
Обычно нет: перезаполнение очищает табличную часть и строит её заново. Если правки нужны, используйте «Подбор» или правьте строки после заполнения.
Как понять, как называется табличная часть в коде?
Откройте документ в Конфигураторе: табличные части перечислены в дереве объекта. Их имена отличаются от заголовков вкладок в форме.
Можно ли отменить изменения, которые сделала обработка?
Кнопки отмены у обработки нет. Вернуть прежние строки можно из резервной копии или повторным запуском обработки с обратной заменой, если правка была однозначной.
Почему после замены номенклатуры не пересчиталась сумма?
Программная правка колонки не вызывает обработчики формы. Пересчитайте сумму в коде (Сумма = Количество × Цена) или откройте документ и измените строку вручную.