Изменение строк в документах 1С: вручную, обработкой и кодом
Содержание
Обновить табличную часть документа 1С можно тремя путями: в форме документа (кнопки «Заполнить», «Подбор», правка строк и загрузка из файла), типовой обработкой «Групповое изменение реквизитов» или внешней обработкой со встроенным кодом. Для одного-двух документов хватает формы. Для сотни документов нужна обработка, после которой проведённые документы обязательно перепроводят.
Прямая правка таблиц через SQL и «обновление через консоль запросов» не работают так, как ожидают: язык запросов 1С данные только читает, а SQL обходит всю логику программы. Ниже по порядку — от безопасного к рискованному. Всё описанное относится к платформе 8.3 и типовым конфигурациям на управляемых формах (БП 3.0, УТ 11, ЗУП 3.1).
Какой способ обновления табличной части выбрать
Слово «обновить» здесь означает разные задачи. Перезаполнить строки по новым данным. Заменить значение в колонке. Удалить лишние строки. Или просто перечитать форму, чтобы увидеть чужие изменения. От задачи зависит инструмент.
| Способ | Когда подходит | Риски |
|---|---|---|
| Ручная правка в форме | 1–10 документов, разные правки | Опечатки, забытое перепроведение |
| Групповое изменение реквизитов | Одно значение во многих документах | Меньше гибкости в условиях по строкам |
| Внешняя обработка | Правка строк по условию, сотни документов | Ошибка в коде затронет все документы |
| Код в форме документа | Доработка конфигурации, кнопка для пользователей | Нужен Конфигуратор или расширение |
| SQL напрямую | Не рекомендуется | Регистры и итоги не пересчитаются |
Как обновить табличную часть документа вручную в форме
Ручной путь самый безопасный: все обработчики формы срабатывают, суммы и НДС пересчитываются сами.
Перезаполнение строк
Во многих типовых документах над табличной частью есть кнопка «Заполнить». Она перестраивает строки по основанию: по остаткам, по заказу, по сотрудникам подразделения. Учтите, что перезаполнение обычно очищает текущие строки, а ручные правки пропадут.
Кнопка «Подбор» добавляет строки к существующим, ничего не удаляя. Ей удобно дополнять документ, когда основная часть уже введена.
Правка нескольких строк сразу
- Выделите строки мышью с зажатым
Ctrl(по одной) илиShift(диапазон). - Выделите всю табличную часть сочетанием
Ctrl+A. - Скопируйте строки
Ctrl+Cи вставьтеCtrl+V— так быстро переносят строки между двумя документами одного вида. - Удалите выделенные строки клавишей
Delete.
Колонку с одинаковым значением, например ставку НДС или счёт учёта, удобнее менять обработкой из следующего раздела: вручную правка каждой строки на 200 позиций займёт полчаса.
Загрузка из файла
В БП 3.0 и УТ 11 у табличной части «Товары» в большинстве документов есть команда загрузки из файла — кнопка «Загрузить» или пункт в меню Ещё. Она принимает таблицу Excel, сопоставляет колонки и строки с номенклатурой. Так обновляют длинный список, когда новые цены и количества пришли от поставщика в файле.
Перечитать документ
Если документ открыт давно, а коллега тем временем его изменил, форма покажет старые строки. Закройте документ без записи и откройте снова. В меню Ещё формы есть стандартная команда «Перечитать» — она загружает актуальную версию из базы.
После любой ручной правки проведённого документа нажимайте «Провести», а не «Записать». Запись без проведения меняет строки, но движения по регистрам остаются старыми.
Групповое изменение реквизитов и другие типовые обработки
В типовых конфигурациях на БСП есть обработка «Групповое изменение реквизитов». В БП 3.0 она лежит в разделе Администрирование → Обслуживание → Корректировка данных. Быстрее вызвать её из списка документов:
- Откройте журнал нужного вида документов, например «Реализация (акты, накладные)».
- Установите отбор по периоду или контрагенту.
- Выделите нужные документы (
Ctrl+A— все в отборе). - В меню
Ещёвыберите команду изменения выделенных. - Отметьте реквизит, задайте новое значение и нажмите «Изменить реквизиты».
В актуальных версиях обработки можно выбрать и колонки табличных частей. Значение тогда ставится во все строки выбранных документов. Если нужно менять строки по условию — например, только строки с конкретной номенклатурой — возможностей обработки не хватит.
💡 После группового изменения перепроведите затронутые документы обработкой «Групповое перепроведение документов» (раздел Операции). Так регистры и проводки придут в соответствие с новыми строками.
Для старых конфигураций на обычных формах (платформа 8.2) использовали универсальную обработку «Групповая обработка справочников и документов» с диска ИТС. На управляемых формах 8.3 её заменяет обработка из БСП.
Внешняя обработка: программное обновление табличной части документов
Когда правка идёт по условию или затрагивает сотни документов, пишут внешнюю обработку. Её открывают через Файл → Открыть. Нужны права на открытие внешних обработок, а платформа покажет предупреждение безопасности.
Перед запуском сделайте резервную копию базы (выгрузку в .dt или копию каталога файловой базы). Ошибка в коде за секунды испортит все отобранные документы.
Пример: заменить одну номенклатуру на другую в реализациях за период и перепровести их. Код выполняется на сервере.
&НаСервере
Процедура ЗаменитьНоменклатуруНаСервере()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| Т.Ссылка КАК Ссылка
|ИЗ
| Документ.РеализацияТоваровУслуг.Товары КАК Т
|ГДЕ
| Т.Номенклатура = &Старая
| И Т.Ссылка.Дата МЕЖДУ &Начало И &Конец";
Запрос.УстановитьПараметр("Старая", Объект.СтараяНоменклатура);
Запрос.УстановитьПараметр("Начало", НачалоДня(Объект.ДатаНачала));
Запрос.УстановитьПараметр("Конец", КонецДня(Объект.ДатаОкончания));
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ДокОбъект = Выборка.Ссылка.ПолучитьОбъект();
Для Каждого Стр Из ДокОбъект.Товары Цикл
Если Стр.Номенклатура = Объект.СтараяНоменклатура Тогда
Стр.Номенклатура = Объект.НоваяНоменклатура;
КонецЕсли;
КонецЦикла;
Режим = ?(ДокОбъект.Проведен,
РежимЗаписиДокумента.Проведение,
РежимЗаписиДокумента.Запись);
Попытка
ДокОбъект.Записать(Режим);
Исключение
Сообщить(СтрШаблон("%1: %2", Строка(Выборка.Ссылка), ОписаниеОшибки()));
КонецПопытки;
КонецЦикла;
КонецПроцедуры
Здесь СтараяНоменклатура, НоваяНоменклатура, ДатаНачала и ДатаОкончания — реквизиты самой обработки. Запрос отбирает только документы, где строка реально есть, а не перебирает все реализации подряд.
Как прогнать обработку без риска
- Разверните копию рабочей базы: загрузите свежую выгрузку .dt в новую пустую базу.
- Запустите обработку на копии с узким отбором — один день или один контрагент.
- Откройте два-три изменённых документа и сравните строки, суммы и проводки с исходными.
- Сформируйте оборотно-сальдовую ведомость по затронутым счетам до и после правки.
- Только после этого запускайте обработку в рабочей базе на полный период.
Сообщения из блока Исключение сохраните: в них список документов, которые не записались. Их обычно немного, и проще поправить вручную.
Полезные методы табличной части
- 🔹
Добавить()— новая строка, возвращает её для заполнения. - 🔹
Удалить(Строка)— удаляет строку. - 🔹
Очистить()— удаляет все строки. - 🔹
НайтиСтроки(Структура)— массив строк по условию. - 🔹
Выгрузить()иЗагрузить(ТаблицаЗначений)— перенос в таблицу значений и обратно.
Удалять строки внутри цикла Для Каждого по той же табличной части нельзя: строки будут пропущены. Сначала найдите их, потом удалите:
Нулевые = ДокОбъект.Товары.НайтиСтроки(Новый Структура("Количество", 0));
Для Каждого Стр Из Нулевые Цикл
ДокОбъект.Товары.Удалить(Стр);
КонецЦикла;
Чтобы схлопнуть повторяющиеся строки, выгрузите табличную часть, сверните и загрузите обратно:
ТЗ = ДокОбъект.Товары.Выгрузить();
ТЗ.Свернуть("Номенклатура, Цена", "Количество, Сумма");
ДокОбъект.Товары.Загрузить(ТЗ);
Колонки таблицы значений должны называться так же, как реквизиты табличной части. Колонки, не указанные в Свернуть(), исчезнут, и в документе эти поля станут пустыми. В реальном документе добавьте в список все нужные колонки: ставку НДС, сумму НДС, счета учёта.
Запись без обработчиков
Иногда нужно поправить поле, которое не влияет на учёт, и не запускать долгие проверки. Для этого перед записью ставят ДокОбъект.ОбменДанными.Загрузка = Истина и пишут в режиме РежимЗаписиДокумента.Запись. Обработчики ПередЗаписью и проверки конфигурации тогда пропускаются.
В режиме загрузки движения не перестраиваются, а связанные поля не пересчитываются. Применяйте его только к полям вроде комментария строки, а не к количеству, цене или сумме.
Обновление строк из кода формы документа
Если пользователи регулярно делают одну и ту же правку, её оформляют командой в форме документа — через расширение конфигурации, чтобы не снимать типовую с поддержки. Расширения доступны с платформы 8.3.6.
В управляемой форме данные документа лежат в реквизите Объект. Его табличную часть можно менять прямо на клиенте или на сервере:
&НаСервере
Процедура УстановитьСкладВоВсехСтрокахНаСервере(Склад)
Для Каждого Стр Из Объект.Товары Цикл
Стр.Склад = Склад;
КонецЦикла;
Модифицированность = Истина;
КонецПроцедуры
Форма обновится сама после возврата с сервера. Документ пока не записан: пользователь увидит изменения и решит, проводить его или нет. Имя колонки Склад условное — в конкретном документе сверьте имена реквизитов в Конфигураторе.
Когда нужны методы модуля объекта, переведите данные формы в объект и обратно:
ДокОбъект = РеквизитФормыВЗначение("Объект");
ДокОбъект.ЗаполнитьПоОснованию(...); // любой метод модуля объекта
ЗначениеВРеквизитФормы(ДокОбъект, "Объект");
Для текущей строки на клиенте используют Элементы.Товары.ТекущиеДанные — это данные строки, на которой стоит курсор.
Консоль запросов и SQL: что можно, а что нельзя
Консоль запросов — внешняя обработка для чтения данных. Язык запросов 1С умеет только выбирать: команд изменения строк в нём нет. Поэтому консоль помогает найти документы, которые надо исправить, но сама ничего не обновляет. Текст запроса из консоли переносят во внешнюю обработку — как в примере выше.
Прямая правка таблиц в MS SQL или PostgreSQL технически возможна для клиент-серверной базы. Табличные части хранятся в отдельных таблицах вида _Document123_VT456, поля называются _Fld…. Соответствие имён объектам 1С показывает функция ПолучитьСтруктуруХраненияБазыДанных().
Почему так делать не стоит:
- ❌ не пересчитываются движения, регистры и итоги — отчёты разойдутся с документами;
- ❌ не срабатывают проверки, блокировки и история изменений;
- ❌ легко нарушить ссылочную целостность и получить «битые» ссылки;
- ❌ фирма 1С такие изменения не поддерживает, а файловая база через SQL недоступна вообще.
Если строки всё же правили в SQL, перепроведите документы средствами 1С и запустите тестирование и исправление в Конфигураторе. Для тестирования нужен монопольный доступ — пользователей придётся вывести из базы.
Ошибки при обновлении табличной части и что с ними делать
Ещё одна частая беда — правка при одновременной работе пользователей. Если обработка меняет много документов, запускайте её вечером или в выходной. Иначе часть документов будет заблокирована, а пользователи получат сообщения о конфликте записи.