Найти в Дзене

Как перезаписать документ 1с программно

Конечно, давайте подробно разберемся, как перезаписать документ в 1С программно. Перезапись документа программным путем – это мощная возможность, которая позволяет автоматизировать изменение существующих документов в вашей информационной базе 1С. Однако, важно понимать, что такое действие требует осторожности и четкого понимания последствий, так как может привести к изменению ранее введенных данных и, потенциально, к нарушению целостности учета. Когда может понадобиться программная перезапись документа? Программная перезапись документов может потребоваться в различных сценариях, таких как: Важно! Прежде чем приступать к программной перезаписи документов, тщательно взвесьте все риски и последствия. Рассмотрите альтернативные способы решения задачи, такие как документы исправления (например, "Корректировка реализации", "Исправление поступления") или создание новых документов вместо изменения существующих, если это возможно. Перезапись документов следует использовать только тогда, когда

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

Когда может понадобиться программная перезапись документа?

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

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

Важно! Прежде чем приступать к программной перезаписи документов, тщательно взвесьте все риски и последствия. Рассмотрите альтернативные способы решения задачи, такие как документы исправления (например, "Корректировка реализации", "Исправление поступления") или создание новых документов вместо изменения существующих, если это возможно. Перезапись документов следует использовать только тогда, когда это действительно необходимо и является наиболее оптимальным решением.

Основные подходы к программной перезаписи документов в 1С:

В "1С:Предприятие" для программной перезаписи документов обычно используются следующие основные подходы:

  1. Получение объекта документа и его последующая запись: Это наиболее распространенный и рекомендуемый способ. Он предполагает получение объекта документа (не ссылки), внесение необходимых изменений в реквизиты и табличные части объекта, и последующую запись объекта в базу данных.
  2. Использование запросов на обновление (UPDATE) (менее рекомендуется, требует осторожности): В некоторых случаях, для массового изменения простых реквизитов, можно использовать запросы на обновление данных непосредственно в базе данных. Однако, этот способ менее безопасен и не рекомендуется, так как может обойти проверки и бизнес-логику, заложенные в платформе 1С, и привести к несогласованности данных. В большинстве случаев следует избегать прямого SQL UPDATE и использовать первый подход (через объекты документов).

Рассмотрим подробнее первый, рекомендуемый способ – перезапись документа через объект документа.

Пошаговая инструкция по программной перезаписи документа в 1С (через объект документа):

Шаг 1: Получите ссылку на документ, который нужно перезаписать.

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

  • По УникальномуИдентификатору (UUID) документа: Если вы знаете UUID документа, вы можете получить ссылку с помощью метода Документы.<ИмяДокумента>.НайтиПоУникальномуИдентификатору(<UUID>).
  • По номеру и дате документа: Если вы знаете номер и дату документа (что менее надежно, так как номер и дата не гарантируют уникальность в общем случае, особенно при периодической нумерации), можно использовать запрос для поиска документа по номеру и дате.
  • Из результатов запроса: Если вы выполняете запрос к базе данных и получаете ссылки на документы в результате запроса.
  • Из формы списка документов: Если пользователь выбирает документ в форме списка, вы можете получить ссылку на текущий документ формы.

Примеры получения ссылки на документ:

Фрагмент кода

// Пример 1: Получение ссылки на документ "РеализацияТоваровУслуг" по УникальномуИдентификатору (UUID)
УникальныйИдентификаторДокумента = Новый УникальныйИдентификатор("ваш_UUID_документа"); // Замените на реальный UUID
СсылкаНаДокумент = Документы.РеализацияТоваровУслуг.НайтиПоУникальномуИдентификатору(УникальныйИдентификаторДокумента);

// Пример 2: Получение ссылки на документ "СчетНаОплатуПокупателю" по номеру и дате (менее надежно, используйте с осторожностью)
НомерДокумента = "СЧЕТ-0001";
ДатаДокумента = '20240101'; // Дата в строковом формате ГГГГММДД

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| СчетНаОплатуПокупателю.Ссылка
|ИЗ
| Документ.СчетНаОплатуПокупателю КАК СчетНаОплатуПокупателю
|ГДЕ
| СчетНаОплатуПокупателю.Номер = &НомерДокумента
| И СчетНаОплатуПокупателю.Дата = &ДатаДокумента";

Запрос.УстановитьПараметр("НомерДокумента", НомерДокумента);
Запрос.УстановитьПараметр("ДатаДокумента", ДатаДокумента);

РезультатЗапроса = Запрос.Выполнить();

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

// Пример 3: Получение ссылки из формы списка документов (например, в обработке выбора строки табличного поля формы списка)
// Предположим, что ТабличноеПолеДокументы - это табличное поле формы списка документов
СсылкаНаДокумент = Элементы.ТабличноеПолеДокументы.ТекущаяСтрока.Ссылка;

Шаг 2: Получите объект документа по ссылке.

Имея ссылку на документ, необходимо получить объект документа. Объект документа – это представление документа в памяти, с которым вы можете программно работать: читать и изменять его реквизиты и табличные части. Для получения объекта документа используется метод GetObject() у ссылки на документ.

Фрагмент кода

Если СсылкаНаДокумент <> Неопределено Тогда
ОбъектДокумента = СсылкаНаДокумент.ПолучитьОбъект();
КонецЕсли;

Шаг 3: Внесите необходимые изменения в реквизиты и табличные части объекта документа.

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

Примеры изменения реквизитов и табличных частей:

Фрагмент кода

// Пример 1: Изменение реквизита "Контрагент" и "СуммаДокумента"
Если ОбъектДокумента <> Неопределено Тогда

НовыйКонтрагент = Справочники.Контрагенты.НайтиПоНаименованию("Новый контрагент"); // Пример: поиск контрагента по наименованию
Если НовыйКонтрагент <> Неопределено Тогда
ОбъектДокумента.Контрагент = НовыйКонтрагент; // Изменение реквизита "Контрагент"
КонецЕсли;

ОбъектДокумента.СуммаДокумента = ОбъектДокумента.СуммаДокумента * 1.1; // Увеличение суммы документа на 10%

// ... (дальнейшие изменения, запись документа - Шаг 4) ...

КонецЕсли;


// Пример 2: Изменение табличной части "Товары" (например, изменение цены товара в каждой строке табличной части)
Если ОбъектДокумента <> Неопределено Тогда

Для Каждого СтрокаТовар Из ОбъектДокумента.Товары Цикл
СтрокаТовар.Цена = СтрокаТовар.Цена * 1.05; // Увеличение цены товара на 5%
СтрокаТовар.Сумма = СтрокаТовар.Количество * СтрокаТовар.Цена; // Пересчет суммы строки
КонецЦикла;

// ... (дальнейшие изменения, запись документа - Шаг 4) ...

КонецЕсли;


// Пример 3: Добавление новой строки в табличную часть "Услуги"
Если ОбъектДокумента <> Неопределено Тогда

НоваяСтрокаУслуги = ОбъектДокумента.Услуги.Добавить();
НоваяСтрокаУслуги.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию("Новая услуга"); // Пример: поиск номенклатуры услуги по наименованию
НоваяСтрокаУслуги.Количество = 1;
НоваяСтрокаУслуги.Цена = 1000;
НоваяСтрокаУслуги.Сумма = 1000;

// ... (дальнейшие изменения, запись документа - Шаг 4) ...

КонецЕсли;

Шаг 4: Запишите измененный объект документа в базу данных.

После внесения всех необходимых изменений в объект документа, чтобы сохранить эти изменения в базе данных, необходимо вызвать метод Записать() у объекта документа. Метод Записать() имеет несколько параметров, которые определяют режим записи документа:

  • ЗаписьРежима: Определяет режим записи документа. Возможные значения (перечисление РежимЗаписиДокумента):ЗаписьРежимаЗаписи.Запись: Простая запись документа. Проводки, движения по регистрам, контроль заполнения и другие стандартные проверки документа не выполняются. Используется для программной записи документов "как есть", без стандартных проверок. Требует осторожности.
    ЗаписьРежимаЗаписи.ЗаписьПроводки: Запись документа с проведением. При записи будут выполнены все стандартные проверки документа,
    выполнены проводки и движения по регистрам (если документ является проводящим). Используется для записи документов с полным набором стандартных процедур (как при интерактивном проведении документа).
    ЗаписьРежимаЗаписи.ОтменаПроведения: Запись документа с отменой проведения. Используется для отмены проведения ранее проведенного документа.
  • РежимЗаписиПроводки: Определяет режим проведения документа (если используется ЗаписьРежимаЗаписи.ЗаписьПроводки). Возможные значения (перечисление РежимПроведенияДокумента):РежимПроведенияДокумента.Оперативный: Оперативное проведение. Проводки и движения формируются в оперативном режиме (обычно используется).
    РежимПроведенияДокумента.Неоперативный:
    1 Неоперативное проведение (задним числом). Проводки и движения формируются в неоперативном режиме (для исправления ошибок прошлых периодов).
    РежимПроведенияДокумента.РучнаяОбработка: Ручная обработка проведения. Система не выполняет автоматическое проведение, проведение должно быть реализовано программно в обработчике проведения документа.

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

Фрагмент кода

// Пример 1: Простая запись документа (без проведения, без проверок) - ЗаписьРежимаЗаписи.Запись (самый быстрый, но самый опасный, требует осторожности)
Если ОбъектДокумента <> Неопределено Тогда
Попытка
ОбъектДокумента.Записать(ЗаписьРежимаДокумента.Запись); // Простая запись без проведения
Сообщить("Документ успешно перезаписан (без проведения). Номер: " + ОбъектДокумента.Номер);
Исключение
Сообщить("Ошибка при перезаписи документа: " + ОписаниеОшибки(), СтатусСообщения.Важное);
КонецПопытки;
КонецЕсли;


// Пример 2: Запись документа с проведением (полное проведение, как при интерактивном проведении) - ЗаписьРежимаЗаписи.ЗаписьПроводки, РежимПроведенияДокумента.Оперативный (рекомендуемый способ для большинства случаев)
Если ОбъектДокумента <> Неопределено Тогда
Попытка
ОбъектДокумента.Записать(ЗаписьРежимаДокумента.ЗаписьПроводки, РежимПроведенияДокумента.Оперативный); // Запись с проведением в оперативном режиме
Сообщить("Документ успешно перезаписан и проведен. Номер: " + ОбъектДокумента.Номер);
Исключение
Сообщить("Ошибка при перезаписи и проведении документа: " + ОписаниеОшибки(), СтатусСообщения.Важное);
КонецПопытки;
КонецЕсли;


// Пример 3: Отмена проведения документа - ЗаписьРежимаЗаписи.ОтменаПроведения
Если ОбъектДокумента <> Неопределено Тогда
Попытка
ОбъектДокумента.Записать(ЗаписьРежимаДокумента.ОтменаПроведения); // Отмена проведения документа
Сообщить("Проведение документа успешно отменено. Номер: " + ОбъектДокумента.Номер);
Исключение
Сообщить("Ошибка при отмене проведения документа: " + ОписаниеОшибки(), СтатусСообщения.Важное);
КонецПопытки;
КонецЕсли;

Выбор режима записи:

  • ЗаписьРежимаЗаписи.ЗаписьПроводки, РежимПроведенияДокумента.Оперативный (Пример 2)Наиболее рекомендуемый режим для большинства сценариев перезаписи документов. Он обеспечивает максимальную корректность данных, так как при записи будут выполнены все стандартные проверки, документ будет проведен, и движения по регистрам будут обновлены. Этот режим аналогичен интерактивному проведению документа.
  • ЗаписьРежимаЗаписи.Запись (Пример 1) – Используется с осторожностью только в тех случаях, когда действительно необходимо пропустить все стандартные проверки и проведение документа, и вы полностью уверены в корректности вносимых изменений и последствиях такой записи. Например, этот режим может быть использован для технических целей, при массовой загрузке данных или при обработке данных из внешних источников, когда последующее проведение документов будет выполняться отдельно. Не рекомендуется использовать этот режим без понимания последствий.
  • ЗаписьРежимаЗаписи.ОтменаПроведения (Пример 3) – Используется для программной отмены проведения ранее проведенного документа. Полезно, например, при автоматической корректировке данных, когда нужно временно отменить проведение группы документов, внести изменения, а затем перепровести их.

Полный пример кода программной перезаписи документа "РеализацияТоваровУслуг" с изменением контрагента и проведением:

Фрагмент кода

Перем СсылкаНаДокументРеализация;

&НаКлиенте
Процедура ИзменитьКонтрагентаИПерезаписатьДокумент(Команда)

УникальныйИдентификаторДокумента = Новый УникальныйИдентификатор("ваш_UUID_документа_реализации"); // Замените на реальный UUID документа реализации

Если ЗапроситьПодтверждениеПерезаписи() Тогда

ПерезаписатьДокументНаСервере(УникальныйИдентификаторДокумента);

КонецЕсли;

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

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

&НаСервере
Процедура ПерезаписатьДокументНаСервере(УникальныйИдентификаторДокумента)

СсылкаНаДокументРеализация = Документы.РеализацияТоваровУслуг.НайтиПоУникальномуИдентификатору(УникальныйИдентификаторДокумента);

Если СсылкаНаДокументРеализация = Неопределено Тогда
Сообщить("Документ не найден.", СтатусСообщения.Важное);
Возврат;
КонецЕсли;

ОбъектДокумента = СсылкаНаДокументРеализация.ПолучитьОбъект();

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


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

ОбъектДокумента.Контрагент = НовыйКонтрагент; // Изменение реквизита "Контрагент"

Попытка
ОбъектДокумента.Записать(ЗаписьРежимаДокумента.ЗаписьПроводки, РежимПроведенияДокумента.Оперативный); // Запись с проведением
Сообщить("Документ 'Реализация товаров и услуг' успешно перезаписан и проведен. Номер: " + ОбъектДокумента.Номер);
Исключение
Сообщить("Ошибка при перезаписи и проведении документа 'Реализация товаров и услуг': " + ОписаниеОшибки(), СтатусСообщения.Важное);
КонецПопытки;

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

Важные моменты и рекомендации при программной перезаписи документов:

  • Резервное копирование базы данных: Перед любыми массовыми операциями по перезаписи документов, обязательно сделайте резервную копию вашей информационной базы данных! Это крайне важно для возможности восстановления данных в случае возникновения ошибок.
  • Тщательное тестирование: Тщательно протестируйте код программной перезаписи в тестовой среде или на копии рабочей базы данных перед применением к рабочей системе. Убедитесь, что код работает корректно, вносит именно те изменения, которые вам нужны, и не приводит к нежелательным последствиям.
  • Пользовательские права и блокировки: Убедитесь, что пользователь, от имени которого выполняется программная перезапись, имеет достаточные права доступа на изменение документов нужного типа. Учитывайте механизмы блокировок 1С. Если документ открыт на редактирование другим пользователем, программная перезапись может быть невозможна или привести к конфликту блокировок.
  • Транзакции: Используйте транзакции для групповых операций по перезаписи документов. Транзакции гарантируют целостность данных: либо все изменения будут успешно записаны, либо в случае ошибки все изменения будут отменены (rollback). Это особенно важно для массовой перезаписи, чтобы избежать частичного изменения данных.
  • Контроль и аудит: Реализуйте механизмы контроля и аудита процесса программной перезаписи. Ведите логирование всех операций перезаписи: какие документы были изменены, какие изменения внесены, кто и когда выполнил перезапись. Это поможет отслеживать результаты перезаписи, выявлять и устранять возможные ошибки, а также обеспечивать прозрачность и подотчетность действий.
  • Производительность: Массовая программная перезапись большого количества документов может быть ресурсоемкой и занять продолжительное время. Оптимизируйте код для повышения производительности. Выполняйте перезапись в нерабочее время, чтобы минимизировать влияние на работу пользователей.
  • Альтернативные подходы: Рассмотрите альтернативные подходы к решению задачи, прежде чем прибегать к программной перезаписи. Возможно, для вашей задачи будет более уместно использовать документы исправления, механизмы корректировки данных, или разработать специализированную обработку для выполнения необходимых действий с документами без их перезаписи (например, формирование корректирующих документов, создание новых документов на основе существующих, и т.п.). Перезапись – это мощный, но и потенциально опасный инструмент, который следует использовать обдуманно.

В заключение:

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