1С отменить проведение документа программно

Запрещаем повторное проведение (перепроведение) документа в программном коде

1С отменить проведение документа программно
Перейти к содержимому

В ряде случаев документы можно проводить только один раз, так их повторное проведение (иначе называемое перепроведением) приводит к некорректным финансовым результатам.

Существует несколько способов избежать перепроведения. Некоторые из них:

  • Запрет любого изменения документов за определённый период времени;
  • Выполнение перепроведения при помощи специальных обработок, которые не затрагивают документы, для которых перепроведение не допустимо.

В этой статье мы обсудим ещё один способ защиты от нежелательного перепроведения документов. Это блокировка повторного проведения в программном коде.

Зачем это нужно

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

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

Но, если нежелательное перепроведение заблокировано на уровне кода бухгалтерия и руководство могут спать гораздо спокойнее.

Данный способ имеет два варианта реализации.

Вариант 1. Запрос в обработке проведения («плохой» вариант)

Принцип работы этого варианта построен на том, что любой регистр (в частности регистр накопления) при проведении всегда сохраняет информацию о так называемом регистраторе. Документе, при проведении которого была сформирована та или иная запись. Следовательно, если документ ранее уже проводился ссылка на него уже есть в регистре.

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

Ниже приведён пример реализации данного варианта:

Процедура ОбработкаПроведения(Отказ, Режим) Перем Авторы; Перем Элемент; Перем Количество; // Получаем сведения о том, проводился ли данный документ Запрос = Новый Запрос; Запрос.Текст = “ВЫБРАТЬ | КОЛИЧЕСТВО(ТестовыйРегистрНакопления.Регистратор) КАК Регистратор |ИЗ | РегистрНакопления.ТестовыйРегистрНакопления КАК ТестовыйРегистрНакопления |ГДЕ | ТестовыйРегистрНакопления.Регистратор = &Регистратор;”; Запрос.УстановитьПараметр(“Регистратор”, ЭтотОбъект.Ссылка); РезультатЗапроса = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл Количество= ВыборкаДетальныеЗаписи.Регистратор; КонецЦикла; // Если данный документ ранее уже проводился завершаем обработку проведения до записи движения Отказ=(Количество>0); // Движение регистра Движения.ТестовыйРегистрНакопления.Записывать = Истина; Движение = Движения.ТестовыйРегистрНакопления.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Приход; Движение.Период = Дата; Движение.Сумма = Сумма; Авторы = Справочники.Авторы; Элемент =Авторы.СоздатьЭлемент(); Элемент.Наименование = Автор; Элемент.Записать(); КонецПроцедуры

Процедура ОбработкаПроведения(Отказ, Режим)    // Получаем сведения о том, проводился ли данный документ        |    КОЛИЧЕСТВО(ТестовыйРегистрНакопления.Регистратор) КАК Регистратор        |    РегистрНакопления.ТестовыйРегистрНакопления КАК ТестовыйРегистрНакопления        |    ТестовыйРегистрНакопления.Регистратор = &Регистратор;”;    Запрос.УстановитьПараметр(“Регистратор”, ЭтотОбъект.Ссылка);    РезультатЗапроса = Запрос.Выполнить();    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл        Количество= ВыборкаДетальныеЗаписи.Регистратор;    // Если  данный документ ранее уже проводился завершаем обработку проведения до записи движения    Движения.ТестовыйРегистрНакопления.Записывать = Истина;    Движение = Движения.ТестовыйРегистрНакопления.Добавить();    Движение.ВидДвижения = ВидДвиженияНакопления.Приход;    Авторы = Справочники.Авторы;    Элемент =Авторы.СоздатьЭлемент();    Элемент.Наименование = Автор;

Почему этот вариант назван «плохим»?

Дело в том, что, во-первых, он сам по себе очень громоздкий. В главных, количество записей в регистре информационной базы, работающей в организации может быть очень большим. Как следствие возможно падение производительности.

Поэтому использовать данный вариант настоятельно не рекомендуется.

По существу, это решение задачи «в лоб» и гораздо эффективнее вариант 2.

Вариант 2. Обработка события «Перед записью» («хороший» вариант)

Момент проведения документа на самом деле можно поймать не только в соответствующей обработке, но и в процедуре обработки события «ПередСохранением». В этом случае отличительным признаком проведения является значение параметра «РежимЗаписи».

Если значение свойства «Проведён» документа равно «Истина» и режим записи соответствует проведению, то мы имеем дело с перепроведением.

Ниже приведён пример реализации подобной блокировки перепроведения:

Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения) Если ЭтотОбъект.Проведен И РежимЗаписи=РежимЗаписиДокумента.Проведение Тогда Отказ=Истина КонецЕсли; КонецПроцедуры

Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)    Если ЭтотОбъект.Проведен И РежимЗаписи=РежимЗаписиДокумента.Проведение Тогда

Это на порядок проще в реализации чем подход, предложенный ранее и не создаёт проблем с производительностью.

Почему нельзя сделать также в обработке проведения?

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

В 1С Предприятие процесс проведения документа представляет собой единую транзакцию. Поэтому в случае возникновения нештатной ситуации данные останутся корректными вследствие отката всех изменений.

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

По этим причинам использование данного варианта программной блокировки перепроведения является предпочтительным.

Источник: http://streletzcoder.ru/zapreshhaem-povtornoe-provedenie-pereprovedenie-dokumenta-v-programmnom-kode/

1С отменить проведение документа программно

1С отменить проведение документа программно

Здравствуйте, в этой статье мы постараемся ответить на вопрос «1С отменить проведение документа программно». Также Вы можете бесплатно проконсультироваться у юристов онлайн прямо на сайте.

Подсистема «Сканы доков» позволяет к документам «прикреплять» файлы, на формах у всех документов появляется дополнительная вкладка «Сканы» (генерируется программно), которая позволяет добавлять новые файлы к этим документам (это могут быть картинки сканов-оригиналов документов или doc, pdf, xls – файлы), удалять их, т.е. манипулировать «прикрепленными» к документу файлами, просматривать их, а соответственно и печатать прямо из формы документа.

Рассмотрим новую методику проведения на платформе 8.2.

Для этого возьмем демо- конфигурацию «Управляемое приложение» и рассмотрим методику проведения документа «РасходТовара», который делает движения по регистру «ТоварныеЗапасы».

Следующее окно предложит сделать выбор организации и периода за который нужно выполнить перепроведение. Также здесь можно указать возможность останова при появлении ошибок.

Регистрируйтесь в «»!

Данным сообщением программа предупреждает пользователя, что проведение документа нарушает естественную последовательность ввода документов.

Если алгоритм Модуля движения регистров данного документа предусматривает данную ситуацию, например, запускает временный расчет регистров, или для данного документа эта ситуация не является конфликтной (например для выписки приходной накладной не анализирующей текущие остатки регистров), то можно нажимать кнопку «Да». В противном случае, когда правильность проведения нового документа зависит от временной последовательности проведения документов, следует нажимать кнопку «Нет». Тогда документ будет записан, но не проведен. Здесь выводятся все регистры, в которых отметился документ «Начисление зарплаты и взносов», одновременно в виде перечня. Приходится искать среди них нужный нам и просматривать.

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

Подсистема «Фабрика событий» ловит и рассылает события глобального модуля и форм 1С другим классам-подписчикам 1С++, используя механизм класса «МенеджерСобытий» компоненты 1С++. Позволяет объединять в одной конфигурации и параллельно работать нескольким подсистемам (классам) использующим перехват событий глобального модуля и форм. Используются внешние компоненты 1С++ и FormEx.

Но чтобы правильно выбрать ту или иную функцию для своего кода, необходимо представлять в какой последовательности выполняются эти функции и где они выполняются — на клиенте или на сервере.

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

Здесь еще мы видим на первый взгляд такое непонятное свойство «БлокироватьДляИзменения». Зачем оно нужно, если мы сначала пишем и блокировки автоматически установятся? Это свойство актуально в том случае, когда для регистра накопления свойство «Разрешить разделение итогов» равно «Истина».

Как в 1с 8.3 перепровести документы ? Групповое перепроведение документов в 1С

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

В процессе проведения документа пользователем из формы документа система распознавая возможность появления конфликтных ситуаций, выдает пользователю сообщения-запросы, чтобы корректно разрешить возможный конфликт.

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

Выложена демо-конфа, для быстрого ознакомления, в которой установлены все эти три подсистемы и совместно работают, md’шку этой конфы можно использовать для установки в другие конфигурации (см. описание установки).

Подсистема рассчитана на установку и работу в любой конфигурации, установка требует минимальных изменений в конфигурации, прописать пару строк в глобальном модуле и объединить с md’шкой (добавляется несколько объектов), подробнее см. описание установки.

В дальнейшем, после установки в какую-либо конфигурацию, если обновлять эту конфигурацию типовыми обновлениями, то нужно будет только прописать заново эти пару строк в глобальном модуле, после обновления, и все.

Время документа в 1С:Предприятии служит в основном для расстановки документов в определенном порядке, а не для отражения астрономического времени ввода документа. Поэтому при проведении документа время может быть исправлено.

На закладке «Обработки» кликнем «Установка реквизитов», установим пустое значение для реквизита «ПерерассчитываемыйДокумент» и нажмем «Выполнить».
Если в двух словах. Подсистема «Доп.

права доков» позволяет запрещать пользователям системы изменять уже введенные документы тех или иных авторов (запись, проведение, отмена проведения, пометка на удаление, изменение времени).

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

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

Создаем в параметрах Правил обмена один параметр, обзываем его «Таблица документов» в нем будут храниться значения которые загрузились в приемник.

Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования (Linus Torvalds).

Так как запись и проведение документов может выполняться раздельно, в системе предусмотрен механизм обеспечивающий расположение документов не в порядке их записи, а в порядке проведения.

Это позволяет обеспечить проведение всех документов в реальном времени, то есть с обращением в процессе проведения к текущим остаткам регистров.

Также можно использовать дополнительное выпадающее меню по кнопке «Еще…» Здесь можно отменить проведение и повторно провести документ.

Нажмем кнопку «Найти объекты». На закладке «Найденные объекты» бутут отображены все документы, которыми был исправен основной документ. Так как в данном случае дата документа меньше ТА, то система не может обеспечить проведение данного документа в реальном времени.

Источник: http://rusjaimini.ru/arbitrazhnye-dela/4364-1s-otmenit-provedenie-dokumenta-programmno.html

Проведение документа программно 1с. Павел чистов. Хранение документов в информационной базе

1С отменить проведение документа программно

Документы в 1С 8.2 и 8.3 — объект метаданных, с помощью которого в 1С фиксируются хозяйственные операции предприятия.

Каждый созданный документ в конфигурации создать для отражения своего типа операции, например: поступление товаров, списание товаров и т.д.

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

Рассмотрим основные настройки и свойства документов.

Настройка и свойства документов в 1C 8.3 и 8.2

Рассмотрим самые интересные вкладки с точки зрения разработчика.

Данные

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

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

Получите 267 видеоуроков по 1С бесплатно:

Движения документа

Самая важная вкладка, на которой определяется состав регистров, по которым будет делать движения документ:

Рассмотрим подробно свойства документа на этой странице:

Проведение — разрешить или запретить. Определяет, будут ли движения по данному документу.

Оперативное проведение — разрешить или запретить. Если установлено разрешить, то проведение документа будущей датой невозможно.

Удаление движений — определяет режим очистки движения документа: Удалять автоматически при отмене проведения — движения будут очищены только при нажатии кнопки «Отмена проведения», но не удаляет при перепроведении. Удалять автоматически— значит, что движения будут удаляться в любом случае, даже если документ 1С перепроводится. Не удалять автоматически — значит, что удаление движений берет на себя разработчик системы.

Также для построения простых движений документа существует специальный конструктор движений, позволяющий упростить разработку:

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

Проведение документов в 1С – это главное условие корректного учета всех денежных средств, товаров и услуг. Существует несколько способов провести документ в 1С. Это сделать можно при открытии списка документов. На рисунке показано, как в Расходных кассовых ордерах провести нужный документ или отменить проведение.

Первая колонка показывает, проведен ли документ. Если на «пиктограмме» присутствует зеленая галочка, значит документ проведен. Для примера, у нас в списке один документ не проведен. Выбрав нужный расходный кассовый ордер правой кнопкой мыши, можно выбрать в меню «Провести» или «Отменить проведение».

Как провести и распровести документ 1с

Провести документ в 1С Предприятие 8.2 можно и другими методами. Зайдя в нужный документ, вверху окна мы увидим кнопки с зеленой и красной стрелочкой. Первая отвечает за проведение, а вторая – за ее отмену. Также, провести и закрыть документ можно через кнопку «ОК».

Существует способ группового проведения документов в 1С. Для этого нужно воспользоваться групповой обработкой справочников и документов (Сервис – Универсальные обработки – Групповая обработка справочников и документов).

В групповой обработке нужно выбрать тип объекта «Документы», добавить нужные документы (например, «Поступление товаров и услуг»).

Также, следует в «Настройках» поставить галочку напротив «Разрешить изменение реквизитов объектов», и при необходимости, внизу добавить критерии отбора.

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

На вкладке «Обработка» будет размещен выбранный нами список документов. В поле «Действие» выберите значение «Изменить реквизит: Проведен», выберите нужное значение (установить или снять) и нажмите на кнопку «Выполнить».

Обратите внимание, что при проведении документов 1С необходимо учитывать время для корректного учета денег и товаров.

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

Теперь вы знаете, как провести документ в 1С Предприятие 8.2. Рекомендуем вам почитать статьи о регистрах накопления и регистрах сведений.

Поводом для написания данной статьи послужила дискуссия на форуме Общий модуль: клиент и сервер о необходимости разработчика доработать типовую УТ 11.1 так, чтоб в момент проведения документа “Заказ клиента” выводилось диалоговое окно с вопросами для обновления информации на форме для изменения логики проведения документа.

При попытке разобраться в необходимости такой меры на первое место встал методологический вопрос: почему нельзя провести подобное в клиент-серверном выполнении? А на самом деле нужно было задать вопрос: зачем нужно подобное уточнение в момент проведения документа. Конечно данная вещь запрещена средствами платформы 1С 8.3 и более ранних версий 8.

2 где есть поддержка клиент-серверного режима работы. С сервера нельзя вызвать клиентскую процедуру. В данной статье я решил использовать опыт разработки практически с “нуля” одной нетиповой торговой конфигурации, где ставилась задача обеспечить максимальную производительность при записи, проведении и отмены проведения документов.

При разработке собственных мелких конфигураций или при необходимости оптимизации таких громоздких как УТ 11.1, которая даже на мощных компьютерах при полностью включенном функционале начинает подтормаживать на любых действиях, не только при записи и проведении “массовых” документов: заказов клиентов, реализации товаров и услуг и прочих.

Особенно это неприятно при выполнении регламентных операций по восстановлению последовательностей.

Конечно, по данной теме есть множество статей, суть которых заключается (особенно это касается клиент-серверных вариантов) в переносе вычислительной нагрузки даже не на сервер приложений, а на SQL сервер, путем не только получения на нем данных из базы 1С, но и проведения там путем запросов математических вычислений с передачей готового результата (при необходимости) за один раз на сервер приложений для записи движений документа “одним пакетом”. Ну или, в случае отказа от проведения, передачи некоторой информации на компьютер клиента для обновления информации в форме документа. Конечно, это все очень важно и нужно, но есть еще одно узкое “бутылочное горло” это подход к самой методологии проведения документов. При сложных случаях во всей цепочке проведения необходимо знать: кто же в данный момент проводит документ человек или компьютер? Поясню на конкретном примере. Допустим есть маленькая конфигурация с несколькими документами и регистрами сведений и накопления. Из нашего примера это даже не маленький аналог УТ 11.1, а скорее очень упрощенная Розница. А вот функционал этой маленькой “розницы” не примитивное пробивание чеков и подготовка отчетов о розничных продажах, а более мощный. В крупных, территориально распределенных организациях бывают так называемые “номенклатурные войны” среди менеджеров: кто раньше всех успел оформить заказ клиента тот заработал больше. Имея номенклатуру в несколько сотен тысяч единиц в реале массово продается несколько десятков. Наподобие советского дефицита “товары повышенного спроса”, которые к тому же нужно особым образом резервировать и по сложной логистической структуре доставлять до адресата – конечного покупателя. А есть товар, которого везде буквально завались и он никому не нужен:) А если для подобной системы требуется еще и получение сложной специализированной отчетности, то создание подобной системы учета “с нуля” оправданы. Так как же добиться быстрого проведения документов? Нужны ли всегда все проверки при использовании файлового или клиент-серверного режима? Предметная область конфигурации была следующей. Как уже упоминалось выше часть товара “повышенного спроса” приходится в реальном времени резервировать и анализировать свободные остатки. Остановимся на одном документе “Заказ покупателя”. В подобной торговой конфигурации он имеет сложный алгоритм резервирования, заполнения и отображения предварительных результатов. Данные для такого документа не один раз приходится получать перед окончательным использованием из различных источников. Там присутствует первоначальная обработка в табличной части некоторой информации с пересылкой на сервер приложений, далее запрос данных на сервере базы данных SQL, дальнейший первоначальный расчет уже в другом запросе, затем возврат результата на сервер приложений, выгрузка в таблицы значений и далее опять обработка кодом в циклах (не все можно получить одним запросом). А если подобная база должна работать в файловом режиме на 2-3 маломощных компьютерах? Как ускорить восстановление посделовательности и обмен данными?Исходя из того, что при программной обработке и проведении документов нужно минимум проверок, а в большинстве случаев они должны вообще отсутствовать (как при обмене данными) мы выбрали два режима функционирования: 1. Документ проводился от руки человека (тут срабатывали интерактивные обработчики формы документа при котором максимум проверок по всевозможным вариантам);2. Программное проведение (восстановление последовательности, обмен данными, внешнее подключение к базе, при котором программно можно все).

В первом случае, события управляемой формы ПередЗаписью(, ) и ПриЗаписи (Отказ) срабатывают только интерактивно (иначе кнопку провести “нажала рука пользователя”). И поскольку при “ручном” нажатии на кнопку можно не только провести (записать без проведения, можно отменить проведение, пометить на удаление), тут срабатывает куча системных обработчиков событий формы, объекта документа (еще не забудем про подписки на события, куда собственно и встраиваем функционал). В таком режиме на клиентской стороне можно использовать возможность задания вопросов пользователю до начала транзакции записи, обращаясь периодически на сервер для забора данных с целью “кто не успел, тот опоздал” проводить анализ данных и, главное что-то записывать в регистры. Дальше возвращаемся на клиент и снова можем задать вопрос, обновить форму и.т.д.

Самое главное, чтоб документ на сервере в момент проведения в процедуре ОбработкаПроведения(), “знал” кто его проводит человек или компьютер (конечно это сильно упрощенно, до этого момента вся серверная часть должна быть подготовлена обработчиками формы либо программными обработчиками второго режима. Обратимся к описанию обработчиков формы (использованы материалы статей :
Модуль формы ПередЗаписью(Отказ, ПараметрыЗаписи)Выполняется на клиенте!Этот обработчик следует использовать, если необходимо организовать диалог с пользователем перед тем, как записать объект. Запросить дополнительную информацию, предупредить о чём-либо, дать возможность отказаться и т.п.Второй параметр этого обработчика «ПараметрыЗаписи» имеет тип «Структура». У документов эти параметры заполняются системой предопределенными параметрами РежимЗаписи, РежимПроведения. Можно добавить свои.

Эти параметры передаются между событиями формы ПередЗаписьюНаСервере, ПриЗаписиНаСервере, ПослеЗаписиНаСервере, где их можно благополучно использовать. Например, при записи регистра сведений, надо сделать запись в другой регистр сведений старое значение ресурса. Можно передать старое значение в эти самые параметры и уже в ПриЗаписиНаСервере сделать запись в другой регистр.

Создадим тестовый пример. В тестовой конфигурации 8.3 будет один документ “заказ покупателя”

И посмотрим на обработчики объекта документа (в модуле документа). Далее создадим управляемую форму и посмотрим на список ее обработчиков

Видим их схожесть. Дальше можно посмотреть участок кода типовой УТ 11.1, где также используется обработчик формы ПередЗаписью (см. рисунок) и обратим внимание на параметры записи, которые можно передать вглубь процедуры (рис. отладчика).

Источник: https://msiw.ru/employment-history/provedenie-dokumenta-programmno-1s-pavel-chistov-hranenie-dokumentov-v/

Схема проведения документов в типовых конфигурациях УТ 11, ERP 2 и КА 2

1С отменить проведение документа программно
Skip to content

В этой статье мы разберем схему проведения документа по регистрам в типовых конфигурациях УТ 11, КА 2 и ERP 2.

Для чего это нужно?

  • Доработка проведения документов по существующим и новым регистрам встречается на любом серьезном проекте.
  • Другой тип задач – разобраться, почему документ формирует те или иные движения.Нередко в документации написано одно, а по факту всё работает иначе. И приходится уходить в отладку, разбираться с общими модулями и стеком из десятка вложенных вызовов.

Что конкретно будем рассматривать

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

В результате Вы будете знать ответы на вопросы:

  • Где находятся алгоритмы формирования движений?
  • Как изменить типовое проведение документа?
  • Как адаптировать документ для движений по собственному регистру?

Для ответа на поставленные вопросы, без «длительного копания в тоннах типового кода» и быстрого получения результата, необходимо знать схему проведения документа.

А что самое приятное – почти все типовые документы проводятся по одинаковой схеме, неважно, реализация это, приходный кассовый ордер или план закупок.
Поэтому, изучив общую схему, Вы сможете доработать любой документ. 🙂

Укрупненно проведение документа происходит в два этапа, первый этап – подготовка и запись данных, второй этап – контроль отрицательных остатков.

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

Дополнительно о методиках контроля остатков можно прочитать в другой нашей статье: https://курсы-по-1с.рф/articles/2017-02-12-two-methods-for-inventory-check/

Театр начинается с вешалки, а проведение документа – с процедуры ОбработкаПроведения() модуля объекта. Порядок действий в обработке проведения документа можно представить в виде следующей схемы:

Рисунок 1. Схема действий обработки проведения документа

Рассмотрим детально каждую точку алгоритма проведения на примере документа «Реализация товаров и услуг».

ПроведениеСервер.ИнициализироватьДополнительныеСвойстваДляПроведения(Ссылка, ДополнительныеСвойства, РежимПроведения);

Вызывается процедура ИнициализироватьДополнительныеСвойстваДляПроведения() общего модуля ПроведениеСервер, в процедуру кроме ссылки и режима проведения передаются ДополнительныеСвойства.

ДополнительныеСвойства – свойство объекта документ, структура, которая может хранить некоторые значения, связанные с объектом, без изменения объекта.

Свойство доступно для изменения не только в обработке проведения, но и прочих обработчиках модуля объекта, и это свойство доступно, пока существует объект. Например, можно в обработчике перед записью поместить в это свойство некоторые данные и затем воспользоваться ими в обработке проведения.

В вызываемой процедуре инициализируются общие для всех документов структуры (ДляПроведения и ТаблицыДляДвижений), используемые при проведении документов.

Рисунок 2. Дополнительные свойства после инициализации

Один из ключей ТаблицыДляДвижений – структура, которая будет содержать таблицы значений с данными для выполнения движений, или, проще говоря, готовые наборы движений документа.

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

Вызывается процедура ИнициализироватьДанныеДокумента() модуля менеджера объекта, в процедуру передается ссылка на объект и ДополнительныеСвойства.

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

После завершения работы процедуры каждый ключ структуры ТаблицыДляДвижений содержит таблицу значений с будущими движениями регистра.

Рисунок 3. Таблицы движений регистров в структуре дополнительных свойств

Обратите внимание, что ключи структуры названы по шаблону Таблица[Вт][ИмяРегистраДляДвижения], где Вт – признак временной таблицы, а ИмяРегистраДляДвижения – наименование регистра, куда будут записаны движения из таблицы значений.

Процедура инициализации – это несколько шагов, каждый из которых требует рассмотрения.

//////////////////////////////////////////////////////////////////////////// // Создадим запрос инициализации движений Запрос = Новый Запрос; ЗаполнитьПараметрыИнициализации(Запрос, ДокументСсылка); //////////////////////////////////////////////////////////////////////////// // Сформируем текст запроса ТекстыЗапроса = Новый СписокЗначений; ТекстЗапросаТаблицаЗаказыКлиентов(Запрос, ТекстыЗапроса, Регистры); ТекстЗапросаТаблицаСвободныеОстатки(Запрос, ТекстыЗапроса, Регистры); ТекстЗапросаТаблицаОбеспечениеЗаказов(Запрос, ТекстыЗапроса, Регистры); ТекстЗапросаТаблицаТоварыКОтгрузке(Запрос, ТекстыЗапроса, Регистры); … //////////////////////////////////////////////////////////////////////////// // Скомпонуем текст запроса и выполним его ПроведениеСервер.ИнициализироватьТаблицыДляДвижений(Запрос, ТекстыЗапроса, ДополнительныеСвойства.ТаблицыДляДвижений, Истина);

Рассмотрим детально, что происходит в модуле менеджера объекта при вызове процедуры инициализации.

Запрос = Новый Запрос;ЗаполнитьПараметрыИнициализации(Запрос, ДокументСсылка);

Создается объект запрос и формируются параметры будущего запроса по полученной ссылке на документ. Все параметры запроса, которые пригодятся для исполнения текста запроса, устанавливаются методом УстановитьПараметр().

ТекстыЗапроса = Новый СписокЗначений;ТекстЗапросаТаблицаЗаказыКлиентов(Запрос, ТекстыЗапроса, Регистры);ТекстЗапросаТаблицаСвободныеОстатки(Запрос, ТекстыЗапроса, Регистры);ТекстЗапросаТаблицаОбеспечениеЗаказов(Запрос, ТекстыЗапроса, Регистры);ТекстЗапросаТаблицаТоварыКОтгрузке(Запрос, ТекстыЗапроса, Регистры);…

Создается список значений ТекстыЗапроса, который будет содержать тексты запроса. Для каждого регистра, по которому требуется сформировать движения, вызывается процедура ТекстЗапросаТаблица[ИмяРегистраДляДвижения], где ИмяРегистраДляДвижения – наименование регистра, для которого формируется таблица движений. Текст запроса добавляется в список значений ТекстыЗапроса.

Вот и ответ на вопрос: «Где находятся алгоритмы формирования движений?».

Именно в процедуре ТекстЗапросаТаблица[ИмяРегистраДляДвижения] содержится текст запроса, на основании которого будут сформированы движения документа в конкретный регистр учетной системы.

ПроведениеСервер.ИнициализироватьТаблицыДляДвижений(Запрос, ТекстыЗапроса, ДополнительныеСвойства.

ТаблицыДляДвижений, Истина);

Список значений ТекстыЗапроса передается в процедуру ИнициализироватьТаблицыДляДвижений() общего модуля ПроведениеСервер, в процедуре производится компоновка общего текста пакетного запроса по данным списка значений и его выполнение. Затем процедура выгружает результаты запроса в таблицы значений, в свойство ТаблицыДляДвижений, рассмотренное на первом шаге.

ПроведениеСервер.ПодготовитьНаборыЗаписейКРегистрацииДвижений(ЭтотОбъект);

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

Процедура взводит флаг записи у наборов записей, по которым документ имеет движения, при этом контролируются ИсключаемыеРегистры – регистры, движения по которым формируются не из модуля менеджера документа.

Например, документ реализации формирует движения по регистру «РасчетыСКлиентамиПоДокументам», но не в момент проведения, а в дальнейшем, при помощи регламентного задания, следовательно, регистр «РасчетыСКлиентамиПоДокументам» будет помещен в исключаемые и флагу записи останется присвоенное значение «Ложь».

ЗаказыСервер.ОтразитьЗаказыКлиентов(ДополнительныеСвойства, Движения, Отказ);ЗапасыСервер.ОтразитьСвободныеОстатки(ДополнительныеСвойства, Движения, Отказ);ЗапасыСервер.ОтразитьОбеспечениеЗаказов(ДополнительныеСвойства, Движения, Отказ);ЗаказыСервер.

ОтразитьТоварыКОтгрузке(ДополнительныеСвойства, Движения, Отказ);…

На этом этапе для каждого регистра таблицы значений с движениями выгружаются из дополнительных свойств в наборы записей регистров.

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

ТаблицаЗаказыКлиентов = ДополнительныеСвойства.ТаблицыДляДвижений.ТаблицаЗаказыКлиентов;…ДвиженияЗаказыКлиентов.Загрузить(ТаблицаЗаказыКлиентов);

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

ПроведениеСервер.ЗаписатьНаборыЗаписей(ЭтотОбъект);

Процедура формирует дополнительные параметры, которые будут доступны в модуле набора записей регистра (подготовка к процедуре контроля), а также выполняет запись движений. Движения записываются в единой последовательности, обеспечивается это тем, что производится запись сразу всей коллекции движений в рамках одной транзакции.

Объект.Движения.Записать();

Такой подход к записи движений устраняет возможные взаимоблокировки в информационной базе, так как ресурсы в транзакции имеют одинаковый порядок захвата.

Движения записаны, настало время проверки результатов проведения.

Вызывается процедура СформироватьСписокРегистровДляКонтроля(), свойства объекта дополняются массивом РегистрыДляКонтроля. По каждому из регистров, находящихся в массиве, будет проведен контроль, за контроль отвечает процедура общего модуля:

ПроведениеСервер.ВыполнитьКонтрольРезультатовПроведения(ЭтотОбъект, Отказ);

В случае выявления несоответствий флаг Отказ будет возведен в «Истину» и проведение документа будет завершено с соответствующим диагностическим сообщением.

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

ПроведениеСервер.ОчиститьДополнительныеСвойстваДляПроведения(ДополнительныеСвойства);

Завершающий этап обработки проведения документа.

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

Например, для документа реализации это актуализация счета-фактуры (приведение состояния счета-фактуры в соответствие с документом-основанием) и регистрация документа продажи, если по нему необходим счет-фактура.

Документы.СчетФактураВыданный.АктуализироватьСчетФактуру(ЭтотОбъект, Истина, ТребуетсяСчетФактура());РегистрыСведений.ТребуетсяОформлениеСчетаФактуры.ОтразитьНеобходимостьОформленияСчетаФактуры(ДополнительныеСвойства, Отказ);

Документ реализации является сложным случаем и имеет дополнительные действия. В простом случае проведения дополнительных действий может и не быть.

В статье рассмотрена схема проведения документа по регистрам учета в типовых конфигурациях УТ 11, КА 2 и ERP 2. Подведем краткие итоги:

Как понять алгоритм формирования движений в определенный регистр?

Алгоритм формирования движений содержится в тексте запроса, который расположен в функции ТекстЗапросаТаблица[ИмяРегистраДляДвижения] модуля менеджера объекта.

Как изменить алгоритм формирования движений в определенный регистр?

Требуется разработать свой текст запроса и поместить его вместо существующего в функцию ТекстЗапросаТаблица[ИмяРегистраДляДвижения] модуля менеджера объекта.

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

Как добавить формирование движений в свой новый регистр?

Требуется разработать текст запроса, формирующий движения, и поместить его в новую, нами созданную, функцию ТекстЗапросаТаблица[ИмяСвоегоНовогоРегистра] модуля менеджера объекта.

В модуле объекта добавить вызов процедуры Отразить[ИмяСвоегоНовогоРегистра] в обработке проведения документа. Текст процедуры формируется по аналогии с типовыми процедурами.

Как провести документ только по одному регистру?

Рассмотрим эмпирическую задачу: нам требуется провести документ реализации только по одному регистру накопления, например, «Свободные остатки». Достаточно создать внешнюю обработку и разместить в ней следующий программный код:

&НаСервереБезКонтекстаПроцедура ПерепровестиДокументРеализацииПоРегиструСвободныеОстатки(РеализацияСсылка, Отказ) РеализацияОбъект = РеализацияСсылка.ПолучитьОбъект();ПроведениеСервер.ИнициализироватьДополнительныеСвойстваДляПроведения(РеализацияСсылка, РеализацияОбъект.ДополнительныеСвойства, РежимПроведенияДокумента.Неоперативный); Документы.РеализацияТоваровУслуг.ИнициализироватьДанныеДокумента(РеализацияСсылка, РеализацияОбъект.ДополнительныеСвойства); ЗапасыСервер.ОтразитьСвободныеОстатки(РеализацияОбъект.ДополнительныеСвойства, РеализацияОбъект.Движения, Отказ); РеализацияОбъект.Движения.Записать(); КонецПроцедуры // ПерепровестиДокументРеализацииПоРегиструСвободныеОстатки()

PDF-версия статьи для участников группы ВКонтакте

Мы ведем группу ВКонтакте – http://.com/kursypo1c.

Если Вы еще не вступили в нее – сделайте это сейчас, и в блоке ниже (на этой странице) появятся ссылки на скачивание материалов.

Если Вы уже участник группы – нужно просто повторно авторизоваться в ВКонтакте, чтобы скрипт Вас узнал. В случае проблем решение стандартное: очистить кэш браузера или подписаться через другой браузер.

Источник: https://xn----1-bedvffifm4g.xn--p1ai/ut11-articles/2017-09-07-documents-posting-scheme/

Как в 1С 8.1 сделать документ непроведенным программно (1С: 8.1: Программисту)

Если ОтменаПроведения= Истина Тогда ДокументОбъект.Проведен=Ложь; КонецЕсли; КонецПроцедуры__
При установке флажка в ИСТИНА пропадает стандартный значок “Отмена проведения” на форме, но в регистре накоплений все равно остаются движения. Если движения отменять стандарным методом, то из регистра они пропадают.

Почему при установке флажка в ИСТИНА стандартный значок  отмены проведения становится неактивный(как происходит, когда нажимаешь на него), но движения все равно не удаляются? 

   ТелепатБот

Книга знаний: Как разрешить проведение будущей датой в форме документа
Книга знаний: Допроведение документа

   Vitello

См. параметр Записать()

   hhhh

(0) “Проведен” — это просто флажок. Хоть его в Ложь устанавливай, хоть в Истину — это никому не интересно. На движения это никак не влияет.

   Parti(2)(3) спс, понял ДокументОбъект.Записать(РежимЗаписиДокумента.ОтменаПроведения);

TurboConf 5 — расширение возможностей Конфигуратора 1С

ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку “Обновить” в браузере.

Ветка сдана в архив. Добавление сообщений невозможно. Но вы можете создать новую ветку и вам обязательно ответят!

Каждый час на Волшебном форуме бывает более 2000 человек.

Особенности использования поля “ПометкаУдаления” объектов базы данных

В структуре объектов базы данных 1С:Предприятия 8 имеется поле ПометкаУдаления. Оно предназначено для работы механизма удаления с контролем ссылочной целостности. Данный механизм позволяет исключить удаление пользователем объекта, если на него имеются ссылки в других данных хранящихся в базе данных. 

С точки зрения системы, удаление без контроля ссылочной целостности (непосредственное удаление) допускается, и наличие в базе данных ссылок на отсутствующие объекты не является ошибкой. Область использования механизма удаления с контролем ссылочной целостности определяется разработчиком конфигурации и администратором.

Запись, проведение и отмена проведения документа 1С

Разработчик конфигурации может регулировать возможность вызова непосредственного удаления пользователями для конкретных типов объектов с помощью права “Интерактивное удаление”. Например, возможность непосредственного удаления может быть запрещена для всех пользователей или может быть оставлена только ответственным пользователям.

Данное право влияет только на интерактивные действия, вызываемые стандартными командами системы. Если удаление выполняется средствами встроенного языка, то данное право может проверяться в модуле. Разумеется, в некоторых случаях непосредственное удаление должно выполняться, если это предусмотрено логикой решаемой задачи.

Например, если выполняется массированное удаление данных регламентной обработкой. Тогда проверка права может не выполняться. 

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

Поле ПометкаУдаления в 1С:Предприятии 8 по своему поведению, в основном, не отличается от других системных полей объекта.

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

Кроме возможности установки пометки удаления путем непосредственного присваивания свойства и записи объекта, существует метод УстановитьПометкуУдаления(). Этот метод выполняет установку свойства в указанное в параметре значение, запись объекта, а также дополнительные действия, содержание которых зависит от типа объекта.

Например, для проведенного документа выполняется отмена проведения, а для справочника выполняется пометка на удаление всех подчиненных элементов в этом справочнике и в подчиненных справочниках. При выполнении пометки на удаление стандартными командами пользовательского интерфейса выполняются действия, соответствующие этому методу.

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

Таким образом, разработчик может при необходимости выполнить пометку удаления без дополнительных действий.

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

Поэтому специального обработчика, сопровождающего пометку и снятие пометки, не существует.

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

Если необходимо анализировать только записываемое значение, то достаточно проверять собственно значение поля. Если необходимо определить факт записи измененного значения, то в обработчике ПередЗаписью() необходимо организовать считывание значения данного поля из базы данных и сравнивать полученное значение с текущим значением. 

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

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

Если документ помечен на удаление, то не допускается выполнение проведения этого документа. Однако допускается наличие движений у документа, помеченного на удаление, так как в 1С:Предприятии 8 понятие проведенности документа не связано жестко с наличием движений.

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

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

Однако это будет являться методологическим приемом, совмещающим пометку на удаление и отключение активности движений.

Проверка при отмене проведения 1С

   УПП

Как программно удалить документ?

 
 

   vvv29

Удалить()

   igork1966ДокументОбъект. (DocumentObject.) Удалить (Delete)Синтаксис: Удалить() Описание: Удаляет документ из базы данных. Важно! В отличие от метода УстановитьПометкуУдаления, данный производит непосредственное удаление документа без возможности восстановления и без проверки ссылочной целостности. Использовать данный метод нужно крайне осмотрительно. Пример: ТекстВопроса = “Удалить документ без возможности восстановления”; Ответ = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет); Если Ответ = КодВозвратаДиалога.Да Тогда РасходнаяНакладная.Удалить(); КонецЕсли; ДокументОбъект. (DocumentObject.) УстановитьПометкуУдаления (SetDeletionMark)Синтаксис: УстановитьПометкуУдаления() Параметры: (обязательный) Тип: Булево. Признак установки / снятие пометки на удаление. Истина — пометка будет установлена; Ложь — пометка будет снята. Описание: Устанавливает/снимет пометку на удаление документа. Документ при этом не удаляется из базы данных. Окончательное удаление помеченных документов происходит при удалении помеченных объектов с проверкой ссылочной целостности данных. Примечание: Применение метода влечет инициирование события ПередЗаписью, т.к. происходит сохранение измененного свойства ПометкаУдаления. Пример:

Если РасходнаяНакладная.ПометкаУдаления Тогда Если РасходнаяНакладная.Проведен Тогда РасходнаяНакладная.Проведен = Ложь; РасходнаяНакладная.Записать(); РасходнаяНакладная.УстановитьПометкуУдаления(Ложь); РасходнаяНакладная.Проведен = Истина; Иначе РасходнаяНакладная.Записать(); РасходнаяНакладная.УстановитьПометкуУдаления(Ложь); КонецЕсли; КонецЕсли;

   Lendy

ДокумекнтОбъект.Удалить()

   vasinok

v8: Обработка (как удалить в базе все документы ?)

Попробуйте новый бесплатный сервис для быстрого анализа кода типовых конфигураций 1c-api.com

ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку “Обновить” в браузере.

Ветка сдана в архив. Добавление сообщений невозможно. Но вы можете создать новую ветку и вам обязательно ответят!

Каждый час на Волшебном форуме бывает более 2000 человек.

Отмена проведения документа (программно)

Источник: https://bookerlife.ru/1s-otmenit-provedenie-dokumenta-programmno/

Сила права
Добавить комментарий