1с изменить движения документа по регистру
Во встроенном языке программирования платформы «1С:Предприятие» встречаются методы, похожие по написанию и использованию, но имеющие отличия в работе.
Участник Мастер-группы курса по подготовке к сертификации “1С:Специалист по платформе 1С:Предприятие 8.3” обратил внимание, что в разных разделах курса метод «Записать()» у движений документа используется по-разному. Он попросил тренера пояснить причину, и теперь использует в своей работе эти методы правильно :)
Вопрос
В тексте ОбработкаПроведения документа «Расходная накладная» записано:
// 1. подготовка регистра бухгалтерии
Движения.Управленческий.Записывать = Истина;
Движения.Управленческий.Записать();
// 2. установка блокировки данных регистра бухгалтерии
Блокировка = Новый БлокировкаДанных;
т.е. после инструкции «Движения.Управленческий.Записать();» следует инструкция наложения блокировки.
А в разделе «Общие, универсальные механизмы, которые используются для решения задач всех разделов» в главе, посвященной «старой» методике контроля остатков, после инструкций «Записывать = Истина; Записать();» рекомендовано восстанавливать для свойства «Записывать» набора движений значение «Истина».
// 1. Подготовка наборов записей регистра
Движения.ОстаткиНоменклатуры.Записывать = Истина;
Движения.Записать();
// 2. Восстановление для свойства набора движений Записывать значения Истина
Движения.ОстаткиНоменклатуры.Записывать = Истина;
Если на экзамене опустить повторную инструкцию «Записывать = Истина», это не будет считаться ошибкой?
Или существует какая то особенность в использовании метода «Записать()» у движений документов?
Ответ
Да, существует особенность. Все зависит от того, каким образом производится запись пустого набора. Обратите внимание, что в задаче бухгалтерского учета запись пустого набора осуществляется методом Движения..Записать(). Это метод набора записей регистра. После его выполнения маркер записи движений не сбрасывается, поэтому его не нужно восстанавливать.
В задаче из общего раздела используется Движения.Записать(). Это метод коллекции движений документа. Он выполняет запись движений по регистрам, у которых установлен маркер записи «Записывать» в значении «Истина», после чего устанавливает его в значение «Ложь». Поэтому, требуется повторная установка признака записи. Если этого не сделать, то при проведении сформированные движения не будут записаны. Это будет ошибкой, и не только на экзамене!
Чтобы проверить это, можно закомментировать восстановление маркера записи, провести документ и посмотреть его движения.
В некоторых типовых конфигурациях фирмы 1С существует возможность ручной корректировки движений документа по регистрам. В конфигурации 1С: Бухгалтерия 8 для этого, при наличии соответствующих прав, нужно открыть движения документа и установить флаг “Ручная корректировка”. Однако, иногда возникает необходимость выполнить корректировку движений большого количества документов. В этом случае нам понадобится обработка, которая изменит движения документов без перепроведения.
Рассмотрим как изменить движения документа на примере конфигурации 1С: Бухгалтерия 8. Менять будем движения по регистру бухгалтерии “Хозрасчетный”. Пусть перед нами стоит задача заполнить суммы налогового учета по данным бухгалтерского. Предположим, что у нас уже есть обработка, которая выбирает необходимые нам документы и последовательно обрабатывает их с помощью описанной нами процедуры “ИзменитьДвиженияДокумента”. Посмотрим как должна выглядеть эта процедура.
Хотелось бы отметить, что без проверки ведения налогового учета на счёте, при попытке записать набор, содержащий проводку с ненулевой суммой по счёту на котором не ведется налоговый учет, возникнет ошибка следующего содержания:
Запись не верна! Поле “Сумма (налоговый учет)” должно быть пустым! (Регистр бухгалтерии: Журнал проводок (бухгалтерский и налоговый учет); Номер строки: 1)
Режим обмена данными устанавливается следующими строками:
Это необходимо для того, чтобы не выполнялся программный код, находящийся в обработчиках событий “ПередЗаписью” модуля набора записей регистра бухгалтерии “Хозрасчетный” и модуля корректируемого документа. В каждом из них (для типовых конфигураций) есть проверка следующего вида:
Движения документа отредактированы вручную и не могут быть автоматически актуализированы.
Похожие FAQ
Как заполнить табличную часть формы программно? 8
Нужно по кнопке Заполнить - сформировать данные для заполнения табличных частей и заполнить их. Форма имеет вид: Рядом с кнопкой Записать и закрыть добавлена кнопка Заполнить документ , код ее команды: // Код заполнения ТЧ НаСервере П 17 правил для составления оптимального ЗАПРОСа к данным базы 1С 44
Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос . Создается этот объект вызовом конструкции Новый Запрос . Запрос удобно использовать, когда требуется получ Google maps : вывод точек на карту и режим панорамы 7
В отличие от яндекс карт в GMaps можно использовать панорамы - за что им большой плюс! Надеюсь в яндексе прочитают этот пост и тоже когда-нибудь это сделают! Для клиента нужно было сделать вывод объектов на карту С возможностью просмотра панора Автоматическая архивация баз 1С с использованием Cobian Backup и VBS скриптов 8
Клиент попросил настроить автоматическую архивацию баз 1С раз в три дня и выгрузку архивов на Dropbox и на FTP Сервер. Кроме 1С нужно архивировать папку с рабочими документами. Хочет - так хочет, делаем: Первым делом настроим автоматическую архивац Ввод данных по командировкам в программе ЗУП 0
Ввод сведений о командировках в программе 1С: Зарплата и управление персоналом 8 (ред.30) осуществляется в Разделе Кадры - Все кадровые документы - Создать - Командировка Откроется документ: Ввод сведений о командировках в программ Посмотреть все результаты поиска похожих
Еще в этой же категории
Заполнить программно Партии в проводках 0
Добрый день! В счете учета включили Субконто3=Партии. Как заполнить партии в проводках, которые уже проведены ранее? Спасибо. Посмотреть все в категории Регистры бухгалтерии
Ключевые слова и Изображения
Слова упорядочены по частоте использования в тексте
Изображения
Исходная задача состояла в том, что надо было ввести остатки на начало года по "партиям НДС" в конфигурации "Комплексная автоматизация" и провести все документы по этому регистру. Сложность была в том, что остатки вводились с опозданием и несколько периодов были уже закрыты. Поэтому напрямую перепроводить документы было уже нельзя (из-за возможных изменений сумм себестоимости и т.д.)
Основная идея заключается в том, что движения делаются с помощью алгоритмов проведения самой конфигурации, но в результате (после перепроведения) оставляется изменение движений только по выбранному регистру.
Этот пример может пригодится, например, в аналогичных описываемому случаях ввода остатков по отдельному регистру, либо в случае изменения алгоритма проведения по определенному регистру.
Не претендуя на оригинальность самой идеи отменять транзакцию, тем не менее хочу представить работающий алгоритм (для конфигураций 1С 8.1/8.2). Возможно, кому-то пригодится в работе. Мне он помогал ещё в нескольких случаях.
В примере приводится проведение по регистру накопления "Размещение". Это регистр был добавлен в конфигурацию и не относится к типовым. Алгоритм легко переделать на другой (другие) нужный регистр. Как с любыми операциями с регистрами, и этой операцией тоже следует пользоваться аккуратно )
Текст самих процедур (8.1/8.2)
//отбираем все проведенные документы, которые могут делать движения по нужному нам
//регистру (РегистрыНакопления.Размещение)
//за указанный период с Дата1 по Дата2
ТекстЗапроса = "ВЫБРАТЬ Документы.Ссылка ИЗ (" ;
Для Каждого Документ Из Метаданные . Документы Цикл
Если Не Документ . Движения . Содержит ( Метаданные . РегистрыНакопления [ ИмяРегистра ]) Тогда
Продолжить;
КонецЕсли;
ТекстЗапроса = ТекстЗапроса + "ВЫБРАТЬ " + Документ . Имя + ".Ссылка КАК Ссылка, " +
Документ . Имя + ".Дата КАК Дата ИЗ Документ." + Документ . Имя + " КАК " + Документ . Имя +
" ГДЕ " + Документ . Имя + ".Дата МЕЖДУ &НачПериода И &КонПериода И "
+ Документ . Имя + ".Проведен ОБЪЕДИНИТЬ ВСЕ " ;
КонецЦикла;
ТекстЗапроса = ТекстЗапроса + "ВЫБРАТЬ NULL, NULL ) КАК Документы ГДЕ НЕ Документы.Ссылка ЕСТЬ NULL УПОРЯДОЧИТЬ ПО Документы.Дата" ;
Запрос = Новый Запрос ( ТекстЗапроса );
Запрос . УстановитьПараметр ( "НачПериода" , НачалоДня ( Дата1 ));
Запрос . УстановитьПараметр ( "КонПериода" , КонецДня ( Дата2 ));
Выборка = Запрос . Выполнить (). Выбрать ();
Сообщить ( Выборка . Количество ());
Пока Выборка . Следующий () Цикл
ОбработкаПрерыванияПользователя ();
ДокСсылка = Выборка . Ссылка ;
Сообщить ( " " + СокрЛП ( ДокСсылка ));
ПровестиПоРегистру ( ДокСсылка , ИмяРегистра );
КонецЦикла;
КонецПроцедуры
Процедура ПровестиПоРегистру ( ДокСсылка , ИмяРегистра )
ДокОбъект = ДокСсылка . ПолучитьОбъект ();
ДокОбъект . Записать ( РежимЗаписиДокумента . Проведение );
ДокОбъект . Движения [ ИмяРегистра ]. Прочитать ();
ТаблицаДвиженийРегистра = ДокОбъект . Движения [ ИмяРегистра ]. Выгрузить ();
//здесь отменяем проведение документа, чтобы ничего не изменилось
//в прошлых периодах (по другим регистрам)
ОтменитьТранзакцию ();
НаборЗаписей = РегистрыНакопления [ ИмяРегистра ]. СоздатьНаборЗаписей ();
НаборЗаписей . Отбор . Регистратор . Установить ( ДокСсылка );
НаборЗаписей . Загрузить ( ТаблицаДвиженийРегистра );
НаборЗаписей . Записать ();
КонецПроцедуры
Решение похожей задачи (но другим способом) для платформы 7.7 описано в статье "Технологическое перепроведение документов"
Забавно - сегодня обнаружил полный аналог этого алгоритма, описанный ранее на "Инфостарт" - "Перепроведение документов только по выбранным регистрам" . Похожие идеи витают в воздухе :)
Алгоритм проведения документа с учетом подписок на события
Если посмотреть свойства документа через палитру свойств, то можно увидеть два важных свойства: "Удаление движений" и "Запись движений при проведении", причем второе НЕ вынесено на закладку "Движения" окна редактирования документа.
1. Удаление движений.
Если свойство "Удаление движений" уставновлено в "Удалять автоматически", то ПЕРЕД началом проведения программа очищает все движения по регистрам. Фактически это означает запись пустого набора записей регистра с видом записи - замещение. А значит, программа выполняет код из процедур "ПередЗаписью" и "ПриЗаписи" модуля набора записей регистров.
2. Процедура "ОбработкаПроведения" модуля документа.
Обратим внимание: в начале обработки проведения у всех движений флаг модифицированности Ложь (значение возвращает метод Движения.Регистр.Модифицированность() ).
При работе с набором записей регистра (например, Движения.Регистр.Очистить() , Движения.Регистр.Добавить() и т.д.) флаг модифицированности становится Истина.
После записи движения в базу Движения.Регистр.Записать() модифицированность снова ложь.
Если в модуле процедуры подписки происходит запись набора регистра в явном виде ( .Записать() ), то программа выполняет код из процедур "ПередЗаписью" и "ПриЗаписи" модуля набора записей регистров и процедуры из подписки на событие "При записи" регистра.
3. Подписки на событие "При проведении" документа
Очередность подписок на одно и то же событие явным образом не определяется 1С, но на практике подписки вызываются в порядке следования в ветке "Подписки на события" окна редактирования конфигурации.
Если регистры записываются с помощь метода Записать () , то выполняются все связанные процедуры.
4. Запись движений.
Вспомним про свойство "Запись движений при проведении" из настроек документа.
Если оно равно "Записывать модифицированные", то в базу будут записаны все движения документа, у которых флаг "Модифицированность" Истина.
Если оно равно "Записывать выбранные", то в базу будут записаны движения регистров, для которых мы явным образом указали необходимость записи.
Запись движений в базу происходит с режимом замещения Истина . Это означает, что будут записаны записи из текущего набора записей регистра коллекции Движения и очищены предыдущие записи.
И в конце р ассмотрим несколько примеров:
Пусть свойство документа "Запись движений при проведении" равно "Записывать модифицированные", а "Удаление движений" - "Не удалять автоматически".
При такой процедуре проведения документ при каждом перепроведении будет добавлять запись в регистр, записи будут множиться. Т.к. строка //*** добавляет записи в регистр, признак Модифицированности снимается.
Правильнее будет написать строку //*** как
или вообще ее опустить, и тогда программа сама запишет модифицированные движения.
В 1С 8 движения документа могут формироваться не только в обработке проведения, но и извне, например, из некоторой служебной обработки (так реализовано допроведение документов, восстановление авансов и т.д.).
В этом случае при перепроведении документа, если происходит изменение движений регистра бухгалтерии (флаг Модифицированности Истина), записи будут замещены записями, сформированными документом.
Перед началом проведения документа все реквизиты документа записываются в базу данных (т.е. программист может их получить с помощью запроса). Во внутренней памяти создается Объект документа, и у этого объекта есть коллекция движений, которая будет записана после окончания процедуры проведения (см. этап 4).
Если в процессе проведения документа движения по регистрам формируются не с помощью коллекции Движения, принадлежащей внутреннему объекту , а другими способами (вручную в форме набора записей или как в примере 2 и т.д.), то на этапе 4 эти записи будут замещены. Чтобы избежать замещения в типовых базах, для документа "ОперацияБух" свойство документа "Проведение" устанавливается в "Запретить".
Если документ должен проводиться по другим регистрам и нельзя запретить проведение, тогда нужно внимательно настраивать свойства документа:
- выбрать вариант записи движений "Записывать выбранные" и убедиться, что Движения.Регистр.Записывать = Ложь
- выбрать вариант записи движений "Записывать модифицированные" и контролировать признак Модифицированности для набора записей этого регистра.
Нужно понимать, что объект, полученный по ссылке (назовем его "ОбъектДок"), и внутренний объект ("ЭтотОбъект"), созданный в памяти в момент проведения, это два разных экземляра объектов.
Соответственно и коллекции движений у них будут разные. У "ОбъектаДок" коллекция движений будет включать только записанный в базу набор записей регистра, а у "ЭтогоОбъекта" - как записанные, так и добавленные и незаписанные записи. По окончании проведения (этап 4) в базу будут записаны наборы записей "ЭтогоОбъекта", причем с признаком Замещать = Истина.
Если записи в набор записей добавляются по способу, описанному выше, то они могут быть замещены на этапе 4.
Манипулирование записями регистров без использования регистратора
В 1С:Предприятии 8 все регистры, кроме регистров сведений, всегда связаны с регистраторами. Регистры сведений могут быть независимыми или также подчиненными регистратору. В этом разделе мы опишем работу с регистрами, подчиненными регистраторам.
В большинстве случаев записи регистров, подчиненных регистраторам, создаются при проведении документов. Это наиболее "естественный" способ создания записей. В этом случае в процессе проведения документа формируются записи регистра, и, тем самым, происходит отражение в учете события описываемого документом.
Однако в 1С:Предприятии 8 существует возможность изменять записи регистров без участия документа. При этом следует учитывать, что каждая запись регистра всегда подчинена одному и только одному регистратору (документу). Поэтому с точки зрения "времени жизни" записи всегда подчинены конкретным регистраторам. Однако, записи могут изменяться без участия самого документа. Главное, чтобы в них имелась ссылка на документ.
Для изменения записей регистров, подчиненных регистраторам, используются наборы записей. При этом всегда используется отбор по регистратору. То есть совокупность записей, подчиненных одному регистратору, является "гранулой" изменения регистра. Нельзя добавлять или удалять отдельные записи. Можно только считывать и записывать записи по регистратору.
При изменении записей регистра можно использовать набор записей, входящий в коллекцию движений документа (свойство Движения объекта ДокументОбъект). Однако это не обязательно. Для изменения записей регистра можно использовать и набор записей созданный с помощью менеджера регистра.
Таким образом, чтобы изменить записи регистра необходимо:
- создать набор записей;
- установить отбор по определенному регистратору;
- прочитать набор;
- изменить записи набора;
- записать набор.
Например, чтобы установить значение реквизита во всех записях регистра можно использовать следующий алгоритм.
//Выберем всех регистраторов регистра
Запрос = Новый Запрос;
Запрос.Текст ;
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
//Обойдем регистраторов
Пока Выборка.Следующий() Цикл
Сообщить("Изменение записей по регистратору: " + Выборка.Регистратор);
//Для каждого регистратора выполним изменение набора записей
НаборЗаписей = РегистрыНакопления.УчетНоменклатуры.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Значение = Выборка.Регистратор;
НаборЗаписей.Прочитать();
Для каждого Запись Из НаборЗаписей Цикл
Запись.Реквизит1 = "Тест";
КонецЦикла;
НаборЗаписей.Записать();
КонецЦикла;
В приведенном примере выполнялось изменение записей. Для добавления записей, если их нет у регистратора, можно выполнять запись без считывания. Для удаления записей можно выполнять запись пустого набора без выполнения считывания.
Заметим, что для добавления большого количества записей по одному регистратору существует возможность записывать записи без замещения. Это регулируется параметром метода Записать(). Такая возможность позволяет добавлять записи, не помещая их всех одновременно в оперативную память.
В регистрах расчетов кроме отбора по регистратору для набора записей можно также установить отбор по другим значениям измерений (только по равенству). Это позволяет выполнить изменение части записей, подчиненных одному регистратору.
Читайте также: