1с добавить движения в документ
Во встроенном языке программирования платформы «1С:Предприятие» встречаются методы, похожие по написанию и использованию, но имеющие отличия в работе.
Участник Мастер-группы курса по подготовке к сертификации “1С:Специалист по платформе 1С:Предприятие 8.3” обратил внимание, что в разных разделах курса метод «Записать()» у движений документа используется по-разному. Он попросил тренера пояснить причину, и теперь использует в своей работе эти методы правильно :)
Вопрос
В тексте ОбработкаПроведения документа «Расходная накладная» записано:
// 1. подготовка регистра бухгалтерии
Движения.Управленческий.Записывать = Истина;
Движения.Управленческий.Записать();
// 2. установка блокировки данных регистра бухгалтерии
Блокировка = Новый БлокировкаДанных;
т.е. после инструкции «Движения.Управленческий.Записать();» следует инструкция наложения блокировки.
А в разделе «Общие, универсальные механизмы, которые используются для решения задач всех разделов» в главе, посвященной «старой» методике контроля остатков, после инструкций «Записывать = Истина; Записать();» рекомендовано восстанавливать для свойства «Записывать» набора движений значение «Истина».
// 1. Подготовка наборов записей регистра
Движения.ОстаткиНоменклатуры.Записывать = Истина;
Движения.Записать();
// 2. Восстановление для свойства набора движений Записывать значения Истина
Движения.ОстаткиНоменклатуры.Записывать = Истина;
Если на экзамене опустить повторную инструкцию «Записывать = Истина», это не будет считаться ошибкой?
Или существует какая то особенность в использовании метода «Записать()» у движений документов?
Ответ
Да, существует особенность. Все зависит от того, каким образом производится запись пустого набора. Обратите внимание, что в задаче бухгалтерского учета запись пустого набора осуществляется методом Движения..Записать(). Это метод набора записей регистра. После его выполнения маркер записи движений не сбрасывается, поэтому его не нужно восстанавливать.
В задаче из общего раздела используется Движения.Записать(). Это метод коллекции движений документа. Он выполняет запись движений по регистрам, у которых установлен маркер записи «Записывать» в значении «Истина», после чего устанавливает его в значение «Ложь». Поэтому, требуется повторная установка признака записи. Если этого не сделать, то при проведении сформированные движения не будут записаны. Это будет ошибкой, и не только на экзамене!
Чтобы проверить это, можно закомментировать восстановление маркера записи, провести документ и посмотреть его движения.
Алгоритм проведения документа с учетом подписок на события
Если посмотреть свойства документа через палитру свойств, то можно увидеть два важных свойства: "Удаление движений" и "Запись движений при проведении", причем второе НЕ вынесено на закладку "Движения" окна редактирования документа.
1. Удаление движений.
Если свойство "Удаление движений" уставновлено в "Удалять автоматически", то ПЕРЕД началом проведения программа очищает все движения по регистрам. Фактически это означает запись пустого набора записей регистра с видом записи - замещение. А значит, программа выполняет код из процедур "ПередЗаписью" и "ПриЗаписи" модуля набора записей регистров.
2. Процедура "ОбработкаПроведения" модуля документа.
Обратим внимание: в начале обработки проведения у всех движений флаг модифицированности Ложь (значение возвращает метод Движения.Регистр.Модифицированность() ).
При работе с набором записей регистра (например, Движения.Регистр.Очистить() , Движения.Регистр.Добавить() и т.д.) флаг модифицированности становится Истина.
После записи движения в базу Движения.Регистр.Записать() модифицированность снова ложь.
Если в модуле процедуры подписки происходит запись набора регистра в явном виде ( .Записать() ), то программа выполняет код из процедур "ПередЗаписью" и "ПриЗаписи" модуля набора записей регистров и процедуры из подписки на событие "При записи" регистра.
3. Подписки на событие "При проведении" документа
Очередность подписок на одно и то же событие явным образом не определяется 1С, но на практике подписки вызываются в порядке следования в ветке "Подписки на события" окна редактирования конфигурации.
Если регистры записываются с помощь метода Записать () , то выполняются все связанные процедуры.
4. Запись движений.
Вспомним про свойство "Запись движений при проведении" из настроек документа.
Если оно равно "Записывать модифицированные", то в базу будут записаны все движения документа, у которых флаг "Модифицированность" Истина.
Если оно равно "Записывать выбранные", то в базу будут записаны движения регистров, для которых мы явным образом указали необходимость записи.
Запись движений в базу происходит с режимом замещения Истина . Это означает, что будут записаны записи из текущего набора записей регистра коллекции Движения и очищены предыдущие записи.
И в конце р ассмотрим несколько примеров:
Пусть свойство документа "Запись движений при проведении" равно "Записывать модифицированные", а "Удаление движений" - "Не удалять автоматически".
При такой процедуре проведения документ при каждом перепроведении будет добавлять запись в регистр, записи будут множиться. Т.к. строка //*** добавляет записи в регистр, признак Модифицированности снимается.
Правильнее будет написать строку //*** как
или вообще ее опустить, и тогда программа сама запишет модифицированные движения.
В 1С 8 движения документа могут формироваться не только в обработке проведения, но и извне, например, из некоторой служебной обработки (так реализовано допроведение документов, восстановление авансов и т.д.).
В этом случае при перепроведении документа, если происходит изменение движений регистра бухгалтерии (флаг Модифицированности Истина), записи будут замещены записями, сформированными документом.
Перед началом проведения документа все реквизиты документа записываются в базу данных (т.е. программист может их получить с помощью запроса). Во внутренней памяти создается Объект документа, и у этого объекта есть коллекция движений, которая будет записана после окончания процедуры проведения (см. этап 4).
Если в процессе проведения документа движения по регистрам формируются не с помощью коллекции Движения, принадлежащей внутреннему объекту , а другими способами (вручную в форме набора записей или как в примере 2 и т.д.), то на этапе 4 эти записи будут замещены. Чтобы избежать замещения в типовых базах, для документа "ОперацияБух" свойство документа "Проведение" устанавливается в "Запретить".
Если документ должен проводиться по другим регистрам и нельзя запретить проведение, тогда нужно внимательно настраивать свойства документа:
- выбрать вариант записи движений "Записывать выбранные" и убедиться, что Движения.Регистр.Записывать = Ложь
- выбрать вариант записи движений "Записывать модифицированные" и контролировать признак Модифицированности для набора записей этого регистра.
Нужно понимать, что объект, полученный по ссылке (назовем его "ОбъектДок"), и внутренний объект ("ЭтотОбъект"), созданный в памяти в момент проведения, это два разных экземляра объектов.
Соответственно и коллекции движений у них будут разные. У "ОбъектаДок" коллекция движений будет включать только записанный в базу набор записей регистра, а у "ЭтогоОбъекта" - как записанные, так и добавленные и незаписанные записи. По окончании проведения (этап 4) в базу будут записаны наборы записей "ЭтогоОбъекта", причем с признаком Замещать = Истина.
Если записи в набор записей добавляются по способу, описанному выше, то они могут быть замещены на этапе 4.
Конфигурация ERP.
Создал документ. Он делает движения по двум регистрам.
Как сейчас вывести на форму кнопку что бы смотреть какие движения он делает?
(1) Если не трудно подскажите как её вывести?
Понятно это не сложно. Но что то столкнулся, и пока не понял как это сделать.
(4) ну так, берешь все общие команды, общие формы, подписки на события, обработки, и везде где встречается список документов добавляешь скрупулезно в этот список свой новый документ. Чтобы он везде был.
(7) Не понятно только, как все общие команды, общие формы, подписки на события, обработки? Где это все взять?
у типовых документов. Я так понимаю у моего документа тоже
нужно вывести эту кнопку. И там будет движение документа.
Как только это сделать? А то в (5) совсем что то не то написано мне кажется.
(15) Прикрути уже голосовалку по 5 пункту. Сегодня будем как депутаты. Проголосуем 5 пункт и всего делов.
Движения можно посмотреть из меню Ещё. Можно кнопку для просмотра на форме списка или документа завести: в Ещё выбрать Изменить форму и для Командной панели формы у команды Движения документа в свойстве Только "В ещё" выбрать Нет. Кнопка появится на форме. По её нажатию выведутся отчеты о движениях. Их состав можно определить установкой/сбросом флажков
(30) В форме документа в модуль копируем процедуру, потом на закладке Команды создаем новую команду "ПоказатьДвижения", в в поле Действия указываем "ПоказатьДвижения". Команду не забываем перенести в Командную панель
(30) Да, если в документе ничего нет и нет движений, то ничего и не будет показано, но раюболтаспособность проверить можно - выйдет просто пустая форма. если, конечно, обработка "КорректировкаДвижений" в ЕРП есть.
Найди процедуру ОпределитьОбъектыСКомандамиОтчетов() в конфигурации и добавь туда свой новый документ
(36) Ок, займусь когда буду разбираться.
Не знаю что там в этой ERP есть чего нет из подсистем.
1С:ERP Управление предприятием 2 (2.4.3.144).
(0) самое правильное - не делать отсебятину которая выводит движения.
Надо сделать кнопку такую же как и в других документах. Чтоб всё было однообразно.
Значит ты сам должен в конфигурации посмотреть.
(39) ИМХО - всё единообразно, оно , конечно, по феншую, но, есть пара моментов:
1. Делая вызов кнопки Показать движения, или печать или ещё чего так, как в других документах
мы повторяем вызов тех или иных процедур текущей версии БСП, которые будут работать вплоть её изменения, что для "долгоигращих" настроек не есть хорошо.
2. Изменяя общую команду включением в неё "своих" документов нарываемся на необходимость постоянного контроля их включения при обновлениях конфигурации, бывает, что можно и пропустить.
Оба два варианта проходил на собственном опыте, потому сейчас делаю так, как мне удобнее в сопровождении - я не меняю общие команды и не делаю вызов "по образу и подобию" из БСП, например, процедура из (29) работает уже несколько лет в нескольких настроенных БП без каких бы тони было доработок,а изначальный вывод был связан с предложенными настройками "как в др. документах". после энного количества переделок БСП и соответствующего изменеия в своих документах, пришёл к тому, что буду джелать не по феншую, зато надёжно))))
Ткнули меня как то в Вид - Настройка панелей навигации формы. и перестал я химичить с кнопкой показать движения документа
Нужно перейти в закладку Командный интерфейс и отметить галками движения доступные для просмотра пользователям, после этого появится на форме документа панель слева в которой можно будет перейти в движения документа по регистрам
Похожие FAQ
Еще в этой же категории
Как обновить динамический список или реквизит на форме клиента? 22
Если вы, открыв форму справочника или документа, выполнили некоторое действие, код который должен изменить состояние данных в динамических списках или значение реквизита. Данные изменены, но в открытой форме осталось все как было, можно конечно закр Динамический список ~ Как на управляемой форме разместить список регистра сведений с отбором? 18
Решение рассмотрено для элемента справочника (Контрагент и регистр КонтактнаяИнформация) 1. Создание реквизита: Добавляем новый реквизит формы (. не путать с реквизитом справочника . ) с типом " ДинамическийСписок" В поле " Основная табли Как установить параметр динамического списка? 16
Когда используете для вывода данных динамический список и произвольный запрос, то бывают ситуации когда надо указать параметр используемый в этом запросе. Ниже пример вывода данных регистра сведений в карточке клиента Для вывода используется исп Форма ~ Программное создание таблицы значений с условным оформлением 12
Как создать на форме таблицу и сделать для нее подсветку содержимого колонки в строке по условию? Итак для начала нам надо добавить реквизиты в форму. Для этого у нас есть метод: ИзменитьРеквизиты(). Перед тем как его использовать мы сформируем ма Поле выбора ~ Заполнение списка значений в элементе поле выбора на форме 10
//Заполнение списка перебором данных // Элемент формы МетаданныеВыбор имеет тип - Произвольный, Использование - Режим выбора из Списка, кнопка списка Для Каждого Метаданное из Метаданные.РегламентныеЗадания Цикл ЭлементыФормы.МетаданныеВыбор.Спи Посмотреть все в категории Работа с Формой (Диалог) и её элементами
Конструктор движений регистров предназначен для визуальной настройки правил заполнения движений документа по регистрам, настроенным в конфигурации. Результатом работы конструктора является создание предопределенной процедуры ОбработкаПроведения() в модуле редактируемого документа. Конструктор движений работает только для документов.
Конструктор можно вызвать двумя способами:
Внимание! Конструктор доступен только для тех документов, для которых перечислены зависимые регистры накопления и\или сведений.
Описание конструктора
Сам конструктор состоит из одной единственной формы с тремя табличными полями и набором кнопок:
Поле А — список регистров, по которым формируются движения;
Поле Б — список реквизитов текущего документа, доступные для выбора (если в движениях участвует табличная часть, ее необходимо выбрать в одноименном поле);
Поле В — список полей текущего регистра накопления, доступные для заполнения;
При выделении регистра в поле А происходит изменение списка реквизитов в поле В. Поля Б и В также взаимосвязаны: в списке реквизитов (поле Б) отображаются только те реквизиты, которые подходят для выбора в качестве заполнителя для выделенного реквизита в поле В (совпадают по имени и типу). Галочкой в поле Б помечаются те реквизиты документа, которые имеют тот же тип, что и реквизит, выделенный в поле В.
Кнопка «Заполнить выражения» производит автоматическое заполнение полей регистра по совпадающим имени и типу. Для тех реквизитов в поле В, где конструктор не увидел совпадений, поля останутся пустыми.
Кнопка «Очистить выражения» — очищает любые изменения.
Кнопка «ОК» завершает работу конструктора с сохранением изменений.
Кнопка «Отмена» завершает работу конструктора без сохранения изменений.
Примечательно то, что в значения в поле В можно вводить и вручную. Однако, конструктор не проверяет синтаксическую верность введенных формул. Кроме того, автоматическое заполнение не всегда работает корректно.
Результатом работы конструктора будет процедура ОбработкаПроведения() в модуле текущего объекта. Обратите внимание, что в процедуре присутствуют служебные комментарии конструктора. Таким образом конструктор отделяет свои изменения от кода, введенного вручную:
Внимание! Если Вы впервые вызываете конструктор, а процедура ОбработкаПроведения() уже есть в модуле объекта и содержит код, то по окончании работы конструктора она будет замещена. Все изменения, внесенные вручную могут быть утеряны!
Смотреть на Youtube
Читайте также: