Записать реквизит при проведении документа

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

Я
   radiks

06.04.07 — 15:12

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

  

Партнерская программа EFSOL Oblako

   selenat

1 — 06.04.07 — 15:13

(0) Реквизит = ЗнчениеРеквизита;

   Live

2 — 06.04.07 — 15:17

а для чего тебе? конкретней…

есть риск что будет по 2 раза записываться и проводится

   yalex

3 — 06.04.07 — 15:19

Удалить типовую кнопку «Записать»

Создать свою кнопку, в обработчике которой записывать реквизиты ЭтотогоОбъекта

   radiks

4 — 06.04.07 — 15:20

есть реквизит НомерУпр, его нужно рассчитать и записать только при проведении.

Когда я присваиваю реквизит в ОбработкеПроведения он почему-то не обновляется?

   radiks

5 — 06.04.07 — 15:21

… (2)

   RomaH

6 — 06.04.07 — 15:22

так его записать надо

   Live

7 — 06.04.07 — 15:23

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

   yalex

8 — 06.04.07 — 15:24

(4) В чём проблема?

ЭтотОбъект.ТвойРеквизит = …..

………………………….

ЭтотОбъект.Записать()

   Pike

9 — 06.04.07 — 15:24

Сперва документ записывается, а затем проводится. После установления значения реквизита документа при проведении его (документ) нужно записать с режимом «Запись»

   radiks

10 — 06.04.07 — 15:25

Если записываю реквизит в процедуре ПередЗаписью() или ПриЗаписи(), то все нормально. НО мне нужно записать реквизит именно при проведении.

   selenat

11 — 06.04.07 — 15:27

(10) пробуй (9)…

   yalex

12 — 06.04.07 — 15:28

(10) Попробуй событие ПередПроведением(), но оно только интерактивное

   evgen_5

13 — 06.04.07 — 15:28

Проверять реквизит при проведении если значение реквизита «правильное»

Если ЗначениеРеквизита <> «Правильное» Тогда

   ЗначениеРеквизита = «правильное»;

   Записать();

КонецЕсли;

   RomaH

14 — 06.04.07 — 15:30

(12) заинтриговал, это где ?

   yalex

15 — 06.04.07 — 15:35

(14) Это в списке…В данном случае лажа, конечно, но вдруг

Расширение табличного поля списка документов

ПередПроведением (BeforePosting)

Синтаксис:

ПередПроведением(<Отказ>)

Параметры:

<Отказ>

Тип: Булево. Признак проведения документа. Если в теле процедуры-обработчика установить данному параметру значение Истина, то проведение документа выполнено не будет.

Значение по умолчанию: Ложь

Описание:

Возникает перед интерактивным проведением документа в списке.

   tsr

16 — 06.04.07 — 15:40

Все уже давно придумано.

В модуле документа:

ПередЗаписью(<Отказ>, <Режим записи>, <Режим проведения>)

Параметры:

<Отказ>

Тип: Булево. Признак отказа от записи документа. Если в теле процедуры-обработчика установить данному параметру значение Истина, то запись документа выполнена не будет.

Значение по умолчанию: Ложь

<Режим записи>

Тип: РежимЗаписиДокумента. В параметр передается текущий режим записи документа. Позволяет определить в теле процедуры режим записи. Изменение значения параметра позволяет изменить режим записи.

<Режим проведения>

Тип: РежимПроведенияДокумента. В данный параметр передается текущий режим проведения.

Изменение значения параметра позволяет изменить режим проведения.

Описание:

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

   tsr

17 — 06.04.07 — 15:40

РежимЗаписиДокумента и есть признак проведения

   yalex

18 — 06.04.07 — 15:42

(16) Действительно…

   yalex

19 — 06.04.07 — 15:44

18 + Хотя не, не то автору нужно…

   radiks

20 — 06.04.07 — 15:52

нужно записать реквизит именно при проведении.

При проведении вызывается это событие

s41_blizzard

0 / 0 / 0

Регистрация: 25.07.2015

Сообщений: 32

1

Реквизит не записывается при проведении документа

26.08.2015, 17:58. Показов 19548. Ответов 20

Метки нет (Все метки)


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

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Процедура ПриЗаписи(Отказ)
    Запрос = Новый Запрос();
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   СУММА(РасходыТабЧ.СтоимостьУчастия) КАК ОбщаяСумма,
        |   КОЛИЧЕСТВО(РАЗЛИЧНЫЕ РасходыТабЧ.Ученик) КАК КоличествоСдавших
        |ИЗ
        |   Документ.Расходы.ТабЧ КАК РасходыТабЧ
        |ГДЕ
        |   РасходыТабЧ.Ссылка = &Ссылка";
    Запрос.УстановитьПараметр("Ссылка", Ссылка);
 
    
    РезультатЗапроса = Запрос.Выполнить();
    
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    
    Выборка = Запрос.Выполнить().Выбрать();
    Если Выборка.Следующий() Тогда
            ЭтотОбъект.СуммаДокумента= Выборка.ОбщаяСумма;
            ЭтотОбъект.КоличествоСдавших= Выборка.КоличествоСдавших;
            //ЭтотОбъект.Записать(РежимЗаписиДокумента.Проведение, );
            
    конецЕсли;
КонецПроцедуры



0



Злой самаритянин

182 / 182 / 94

Регистрация: 24.04.2014

Сообщений: 686

26.08.2015, 18:12

2

1. Процедура выбрана, где надо? (см. скрин), вообще для проведения используется процедура ОбработкаПроведения.

2. Внимательно читаем СП:

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

ЭтотОбъект (ThisObject)
Использование:
Только чтение.

Описание:
Тип: ДокументОбъект.
Содержит сам объект базы данных. Предназначено, в основном, для получения данного объекта встроенного языка в модуле объекта или модуле формы.

В модуле объекта обращайся к реквизитам не через ЭтотОбъект, а напрямую.

Еще конструктор движений есть. 2 клик по документу — движения, там кнопка. Посмотри, как он строит процедуру, делай так же.

Миниатюры

Реквизит не записывается при проведении документа
 



0



340 / 315 / 43

Регистрация: 20.08.2014

Сообщений: 1,242

Записей в блоге: 1

26.08.2015, 18:13

3

s41_blizzard, на форме можно ПриЗаписи, ПередЗаписьюНаСервере и и т.д.
ОбработкаПроведения срабатывает после того, как в БД записан документ. Т.е. Данные физически уже в БД.



0



0 / 0 / 0

Регистрация: 25.07.2015

Сообщений: 32

26.08.2015, 18:30

 [ТС]

4

Процедура помещена в модуле документа
Поместил код из первого поста в «обработку проведения», ничего не изменилось.
Я вообще эти реквизиты записываю, чтобы потом поместить эти реквизиты в форму списка этих документов. Дак вот в списке они сразу не появляются, а только после повторного проведения
Да, и сделал как вы посоветовали, убрал «ЭтотОбъект», обратился к реквизитам напрямую

Добавлено через 2 минуты
я пытался этот код поместить не в модуль документа, а именно в модуль формы списка документа, там тоже не заработало



0



340 / 315 / 43

Регистрация: 20.08.2014

Сообщений: 1,242

Записей в блоге: 1

26.08.2015, 18:37

5

s41_blizzard, хм, каша прям из всего.
Если записалось и охота в списке это сразу увидеть — ОбновитьОтображениеДанных() и автообновление 60 секунд например.
Второй вариант через ОбработкуОповещения(), когда документ провелся и там есть ПриЗакрытии() Или ПослеЗаписи() посылать оповещение, а в форме списка ловить.



0



0 / 0 / 0

Регистрация: 25.07.2015

Сообщений: 32

26.08.2015, 18:41

 [ТС]

6

Изначально, я пытался все делать проще: просто в форме списка добавить реквизит «сумма документа». Без всяких доп.примочек. Но в списке почему-то этот реквизит оставался пустым. Пришлось все это писать



0



340 / 315 / 43

Регистрация: 20.08.2014

Сообщений: 1,242

Записей в блоге: 1

26.08.2015, 18:48

7

s41_blizzard, конфигурация своя или типовая?



1



0 / 0 / 0

Регистрация: 25.07.2015

Сообщений: 32

26.08.2015, 18:49

 [ТС]

8

Своя, к сожалению



0



340 / 315 / 43

Регистрация: 20.08.2014

Сообщений: 1,242

Записей в блоге: 1

26.08.2015, 19:08

9

s41_blizzard, понятно. Как реализовать я вкратце написал, дальше поставить задачу чёткую, что в итоге надо и только тогда решите её сами.



0



Эксперт 1С

841 / 604 / 211

Регистрация: 24.07.2013

Сообщений: 2,101

26.08.2015, 19:17

10

s41_blizzard, Обработка события «При записи» выполняется уже после того как объект записан в базу. Поэтому любые модификации объекта уже не к чему не приводят.

В Вашем случае нужно использовать событие «Перед записью». Только в этом случае обращаться к данным с помощью запроса не получится. Придется все посчитать программно.



0



0 / 0 / 0

Регистрация: 25.07.2015

Сообщений: 32

27.08.2015, 15:35

 [ТС]

11

Созрел теперь такой вопрос:
создаю документ «X», у него создаю реквизит «Y». В форме документа этот реквизит отображается, в форме списка — нет. Как такое может быть? Точнее, реквизит в форме списке-то есть, но он не заполняется значениями, которые есть в в самом документе. Я эту тему вообще создал из-за того, что у меня изначально именно с этим была связана.



0



Эксперт 1С

841 / 604 / 211

Регистрация: 24.07.2013

Сообщений: 2,101

27.08.2015, 15:42

12

Может элемент формы не связан с данными документа?

Приложи конфигурацию.



0



0 / 0 / 0

Регистрация: 25.07.2015

Сообщений: 32

27.08.2015, 15:50

 [ТС]

13

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



0



Эксперт 1С

841 / 604 / 211

Регистрация: 24.07.2013

Сообщений: 2,101

27.08.2015, 16:09

14

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



0



0 / 0 / 0

Регистрация: 25.07.2015

Сообщений: 32

27.08.2015, 16:17

 [ТС]

15

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



0



Эксперт 1С

841 / 604 / 211

Регистрация: 24.07.2013

Сообщений: 2,101

27.08.2015, 16:33

16

Цитата
Сообщение от s41_blizzard
Посмотреть сообщение

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

Должен.



0



0 / 0 / 0

Регистрация: 25.07.2015

Сообщений: 32

27.08.2015, 16:36

 [ТС]

17

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



0



Tklwegsd

Эксперт 1С

841 / 604 / 211

Регистрация: 24.07.2013

Сообщений: 2,101

27.08.2015, 16:40

18

Сделай так:

1C
1
2
3
Процедура ПередЗаписью(Отказ)
    СуммаДокумента = 100;
КонецПроцедуры

И убедись, что все работает и отображается сразу.

В конфе проблема в запросе.



0



0 / 0 / 0

Регистрация: 25.07.2015

Сообщений: 32

28.08.2015, 16:10

 [ТС]

19

Запрос вроде бы тоже правильно написал, я проверял через консоль его. Выше сказали, что в процедуре «перед записью» не можно использовать запросы. А как тогда быть?



0



Tklwegsd

Эксперт 1С

841 / 604 / 211

Регистрация: 24.07.2013

Сообщений: 2,101

28.08.2015, 19:21

20

Лучший ответ Сообщение было отмечено s41_blizzard как решение

Решение

Цитата
Сообщение от s41_blizzard
Посмотреть сообщение

Запрос вроде бы тоже правильно написал, я проверял через консоль его.

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

Цитата
Сообщение от s41_blizzard
Посмотреть сообщение

Выше сказали, что в процедуре «перед записью» не можно использовать запросы.

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

Цитата
Сообщение от s41_blizzard
Посмотреть сообщение

А как тогда быть?

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

1C
1
СуммаДокумента = РасходыТабЧ.Итог("СтоимостьУчастия");



1



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

28.08.2015, 19:21

20

  1. Только начинаю программировать в 8, подскажите что не так делаю: В УТ 10.3 в документе ПеремещениеТоваров нет реквизита «Сумма»(тоже непонятно почему). Сделала реквизит «СуммаДок», в модуль проведения в процедуру ОбработкаПроведения дописала

    СуммаДок = 0;
    Для Каждого ТекСтрокаТовары Из Товары Цикл
    СуммаДок = СуммаДок +ТекСтрокаТовары.Цена*ТекСтрокаТовары.Количество; 
    
    

    Теперь, если открыть документ, нажать на ОК, то сумма появиться, если провести через меню Действия
    Провести, то сумма не заполняется, хотя в отладчике все суммируется. Не пойму что не так делаю.


  2. AlexFF

    Offline

    AlexFF
    Разбирающийся

    Регистрация:
    6 мар 2007
    Сообщения:
    565
    Симпатии:
    1
    Баллы:
    26

    Так поделитесь опытом с другими :)

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


  4. BabySG

    Offline

    BabySG
    Администраторы
    Команда форума
    Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    18
    Баллы:
    29

    Присваивать значение реквизиту в обработке проведения — моветон.
    Используйте ПередЗаписью.


  5. sirantd

    Offline

    sirantd

    Регистрация:
    16 окт 2009
    Сообщения:
    2
    Симпатии:
    0
    Баллы:
    1

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


  6. BabySG

    Offline

    BabySG
    Администраторы
    Команда форума
    Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    18
    Баллы:
    29

    Где именно не вызывается? В модуле формы? Там и не должно в этом случае.


  7. sirantd

    Offline

    sirantd

    Регистрация:
    16 окт 2009
    Сообщения:
    2
    Симпатии:
    0
    Баллы:
    1

    Все, теперь и я понял свою ошибку. Все работает, спасибо огромное :)


  8. BabySG

    Offline

    BabySG
    Администраторы
    Команда форума
    Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    18
    Баллы:
    29

    ОФФ: Есть спец кнопка для этого :)


  9. nbIpKuH_BaH9I

    Offline

    nbIpKuH_BaH9I
    Модераторы
    Команда форума
    Модератор

    Регистрация:
    16 сен 2009
    Сообщения:
    7.973
    Симпатии:
    523
    Баллы:
    204

    Пожалуй подниму. У меня есть подписка на событие проведения документа. Где выполняется создание одного справочника. Ссылку на этот справочник я могу получить только после проведения, а мне надо ее записать в реквизит этого же документа. Как такое сделать?


  10. nomad_irk

    Offline

    nomad_irk
    Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.592
    Симпатии:
    999
    Баллы:
    204

    Каким образом ссылка на элемент справочника попадает в реквизит проведенного документа?
    Почему нельзя получить ссылку на элемент справочника внутри ПередЗаписью документа?


  11. nbIpKuH_BaH9I

    Offline

    nbIpKuH_BaH9I
    Модераторы
    Команда форума
    Модератор

    Регистрация:
    16 сен 2009
    Сообщения:
    7.973
    Симпатии:
    523
    Баллы:
    204

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


  12. nomad_irk

    Offline

    nomad_irk
    Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.592
    Симпатии:
    999
    Баллы:
    204

    Делать синхронно высоконагруженные операции и при этом еще генерировать транзакции записи в бд — изначально неправильное решение. Как минимум сделать асинхронный механизм.


1C-pro.ru - форум по 1С:Предприятию 7.7, 8.0, 8.1, 8.2, 8.3

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

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

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

  • Одно событие — ОбработкаПроверкиЗаполненияНаСервере — можно обработать в модуле формы.
  • Другое событие — ОбработкаПроверкиЗаполнения — можно обработать в модуле прикладного объекта.

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

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

Напротив, событие объекта ОбработкаПроверкиЗаполнения предназначено для для того, чтобы проверить реквизиты основного реквизита формы.

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

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

  • самостоятельно проверить заполненность всех реквизитов и очистить массив ПроверяемыеРеквизиты, чтобы платформа не выполняла их проверку
  • проверить часть реквизитов самостоятельно, удалить их из массива ПроверяемыеРеквизиты, а оставшиеся оставить на проверку платформе
  • добавить в массив ПроверяемыеРеквизиты какие-то реквизиты, чтобы платформа проверила и их тоже
  • вообще отказаться от проверки заполненности реквизитов, очистив массив

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

Если Поставщик = Справочники.Поставщики.ПустаяСсылка() Тогда
    Сообщение = Новый СообщениеПользователю();
    Сообщение.Текст = "Необходимо заполнить поставщика!";
    Сообщение.Поле  = "Поставщик";
    Сообщение.УстановитьДанные(ЭтотОбъект);
    Сообщение.Сообщить();
    Отказ = Истина;
КонецЕсли;

// Проверка остальных реквизитов
// ..........

// Очистить массив проверяемых реквизитов, чтобы платформа
// не выполняла их автоматическую проверку
ПроверяемыеРеквизиты.Очистить(); 

Чтобы проверить лишь часть реквизитов, можно выполнить такой код:

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

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

ПроверяемыеРеквизиты.Добавить("Комментарий");

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

ПроверяемыеРеквизиты.Очистить();

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

Справка

ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты)

УправляемаяФорма.ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты)
  • Отказ. Тип: Булево. Признак отказа от записи. Если в теле процедуры-обработчика установить данному параметру значение Истина, то запись выполнена не будет. Значение по умолчанию Ложь.
  • ПроверяемыеРеквизиты. Тип: Массив. Массив путей к реквизитам, для которых будет выполнена проверка заполнения. Массив может быть модифицирован удалением или добавлением путей к необходимым реквизитам.

Вызывается расширением формы при необходимости проверки заполнения реквизитов при записи в форме, а также при выполнении метода ПроверитьЗаполнение(). Для вызова проверки заполнения системой необходимо, чтобы у формы (с которой происходит работа) было установлено свойство ПроверятьЗаполнениеАвтоматически. В этом случае вначале будет вызван данный обработчик, а затем обработчик ОбработкаПроверкиЗаполнения() модуля объекта.

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

Для формы документа, если при конфигурировании для документа свойство Проведение установлено в Разрешить, событие вызывается только при проведении. Если документ не проводится (свойство Проведение установлено в Запретить), то вызывается при записи.

ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)

ДокументОбъект.ИмяДокумента.ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
  • Отказ. Тип: Булево. Если в теле процедуры-обработчика установить данному параметру значение Истина, то будет выполнен отказ от продолжения работы после выполнения проверки заполнения. Значение по умолчанию Ложь.
  • ПроверяемыеРеквизиты. Тип: Массив. Массив путей к реквизитам, для которых будет выполнена проверка заполнения. Массив может быть модифицирован удалением или добавлением путей к необходимым реквизитам.

Вызывается расширением формы при необходимости проверки заполнения реквизитов при записи или при проведении документа в форме, а также при выполнении метода ПроверитьЗаполнение(). Если для документа при конфигурировании свойство Проведение установлено в Разрешить, то вызывается только при проведении. Если документ не проводится (установлено Запретить), то вызывается при записи.

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

Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)

    // Проверим заполненность реквизита «Покупатель»
    Покупатель = ПроверяемыеРеквизиты.Найти("Покупатель");

    Если Не ЗначениеЗаполнено(Покупатель) Тогда
        
        // Если он не заполнен, сообщим об этом пользователю
        Сообщение = Новый СообщениеПользователю();
        Сообщение.Текст = "Не указан Покупатель, на которого выписывается товарная накладная!";
        Сообщение.Поле = "Покупатель";
        Сообщение.УстановитьДанные(ЭтотОбъект);
        Сообщение.Сообщить();
            
        // Сообщим платформе, что мы сами обработали проверку заполнения реквизита «Покупатель»
        ПроверяемыеРеквизиты.Удалить(Покупатель);

        // Так как информация не консистентна, то продолжать работу дальше смысла нет
        Отказ = Истина;
            
    КонецЕсли;

    // Сообщим платформе, что мы сами обрабатываем проверку реквизита товар в табличной части «Товары»
    ПроверяемыеРеквизиты.Удалить(ПроверяемыеРеквизиты.Найти("Товары.Товар"));

    // Обходим строки и проверяем заполнение реквизита
    Для Индекс = 0 По Товары.Количество()-1 Цикл
        СтрокаТовар = Товары.Получить(Индекс);
        Если Не ЗначениеЗаполнено(СтрокаТовар.Товар) Тогда
            Сообщение = Новый СообщениеПользователю();
            Сообщение.Текст = "В строке " + Индекс + " не заполнено значение товара";
            Сообщение.Поле = "Товары[" + Индекс + "].Товар";
            Сообщение.УстановитьДанные(ЭтотОбъект);
            Сообщение.Сообщить();
            Отказ = Истина;
        КонецЕсли;
    КонецЦикла;
    
КонецПроцедуры

Поиск:
1С:Предприятие • Обработка проверки заполнения • Проверяемые реквизиты • Реквизит • Управляемая форма

Программная запись/проведение/отмена проведения документа осуществляется при помощи методаЗаписать(<РежимЗаписи>, <РежимПроведения>) ДокументаОбъекта.

В параметр РежимЗаписи передается одно из значений системного перечисления РежимЗаписиДокумента :

  • Запись (Write)
  • ОтменаПроведения (UndoPosting)
  • Проведение (Posting)

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

Пример №1. Программная запись документа

СсылкаНаДокумент = Документы.АвансовыйОтчет.НайтиПоНомеру("00000000001");

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

    ДокументОбъект.Дата = ТекущаяДата();
    ДокументОбъект.Записать(РежимЗаписиДокумента.Запись);
КонецЕсли;

Пример №2 Программное проведение документа

Запрос = Новый Запрос;

Запрос.УстановитьПараметр("НачалоПериода", НачалоМесяца(ТекущаяДата()));
Запрос.УстановитьПараметр("КонецПериода" , КонецМесяца(ТекущаяДата()));

Запрос.Текст = "ВЫБРАТЬ
               |    ВозвратТоваровОтПокупателя.Ссылка
               |ИЗ
               |    Документ.ВозвратТоваровОтПокупателя КАК ВозвратТоваровОтПокупателя
               |ГДЕ
               |    ВозвратТоваровОтПокупателя.Дата МЕЖДУ &НачалоПериода И &КонецПериода";

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

Для Каждого ЭлементРезультата из Результат Цикл
    ДокументОбъект = ЭлементРезультата.Ссылка.ПолучитьОбъект();

    ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
КонецЦикла;

Пример №3 Программная отмена проведения документа

Запрос = Новый Запрос;

Запрос.УстановитьПараметр("НачалоПериода", НачалоМесяца(ТекущаяДата()));
Запрос.УстановитьПараметр("КонецПериода" , КонецМесяца(ТекущаяДата()));
Запрос.УстановитьПараметр("Счет90"       , ПланыСчетов.Хозрасчетный.НайтиПоКоду("90"));

Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ
               |    ХозрасчетныйОбороты.Регистратор
               |ИЗ
               |    РегистрБухгалтерии.Хозрасчетный.Обороты(&НачалоПериода, &КонецПериода, Регистратор, Счет В ИЕРАРХИИ (&Счет90), , , , ) КАК ХозрасчетныйОбороты";

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

Для Каждого ЭлементРезультата из Результат Цикл
    ДокументОбъект = ЭлементРезультата.Регистратор.ПолучитьОбъект();

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

В этой статье научимся приемами программного создания и заполнения документов в 1С 8.3, кроме того, мы узнаем, как программно записывать и проводить документ 1С,  а также узнаем, как программно открыть основную форму документа.

Прежде чем мы начнем разбирать вопросы программной работы с документами в 1С 8.3, хочу обратить Ваше внимание, что на управляемой форме в режиме тонкого клиента мы можем программно работать (создавать, записывать и проводить) с документами только в серверном контексте. То есть, ваша процедура или функция должна выполняться под директивами &НаСервере или &НаСервереБезКонтекста.

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

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

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

Реквизиты документа в 1С 8.3

Для программного создания документов, я сделал обработку. У этой обработки , я разработал форму и создал команду управляемой формы, которую назвал  «Создать документ прихода», поместив её на форму обработки.

Форма обработки для создания документа

Для этой команды, я сделаю обработчики на клиенте и на сервере.

Создание обработчиков команды

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

&НаСервере
Процедура СоздатьДокументПриходаНаСервере()

    ДокПриход = Документы.ПриходТовара.СоздатьДокумент();

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

&НаКлиенте
Процедура СоздатьДокументПрихода(Команда)
    СоздатьДокументПриходаНаСервере();
КонецПроцедуры

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

Следующим шагом, я присвою дату этому документу, для простоты, это будет текущая дата.

ДокПриход = Документы.ПриходТовара.СоздатьДокумент();
ДокПриход.Дата = ТекущаяДата();

Номер я присваивать не буду, потому что у объекта моего документа включено свойство Автонумерация.

Свойство автонумерация документа

В принципе, этого вполне достаточно, чтобы наш документ существовал. Но создав его при помощи функции СоздатьДокумент, мы не записали его непосредственно в базу. После выполнения кода выше, ни какого документа в базе не появится!

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

Для того, чтобы документ 1С появился в базе, его необходимо записать.  Делается это при помощи метода документа-объекта Записать. Этот метод позволяет и записать, и провести документ. Он имеет два параметра, которые я разберу ниже. Но, метод Записать также можно использовать и без параметров, тогда он будет просто записывать документ. Что мы и сделаем.

ДокПриход = Документы.ПриходТовара.СоздатьДокумент();
ДокПриход.Дата = ТекущаяДата();
ДокПриход.Записать();

Все теперь документ появится в базе.

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

Создание пустого документа

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

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

У нашего документа два реквизита «шапки» – Склад и Комментарий. Создадим на форме обработки реквизит управляемой формы Склад с соответствующим типом, для последующей записи его в шапку документа, а реквизит комментарий заполним в ручную.

Создание реквизита управляемой формы

Присвоим реквизитам созданного объекта-документа нужные значения, просто обратившись через точку к этим реквизитам.

ДокПриход = Документы.ПриходТовара.СоздатьДокумент();
ДокПриход.Дата = ТекущаяДата();
ДокПриход.Склад = Склад;
ДокПриход.Комментарий = "#Документ создан автоматически обработкой"
ДокПриход.Записать();

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

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

ДокПриход = Документы.ПриходТовара.СоздатьДокумент();
ДокПриход.Дата = ТекущаяДата();
ДокПриход.Склад = Склад;
ДокПриход.Комментарий = "#Документ создан автоматически обработкой";
Для Каждого стрТЗ Из ТЗ Цикл
    НовСтрТЧДокумента = ДокПриход.СписокТоваров.Добавить();
    НовСтрТЧДокумента.Номенклатура = стрТЗ.Номенклатура;
    НовСтрТЧДокумента.Количество   = стрТЗ.Количество;
    НовСтрТЧДокумента.Цена         = стрТЗ.Цена;
    НовСтрТЧДокумента.Сумма = НовСтрТЧДокумента.Количество*НовСтрТЧДокумента.Цена;
КонецЦикла;
ДокПриход.Записать();

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

Для Каждого стрТЗ Из ТЗ Цикл
    НовСтрТЧДокумента = ДокПриход.СписокТоваров.Добавить();
    ЗаполнитьЗначенияСвойств(НовСтрТЧДокумента,стрТЗ);
    НовСтрТЧДокумента.Сумма = НовСтрТЧДокумента.Количество*НовСтрТЧДокумента.Цена;
КонецЦикла;


Всё! Мы можем смело создать документ, который будет заполнен.

Создание и заполнение документа 1С

Создание и заполнение документа 1С

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

Все документы, которые мы создавали ранее были не проведены. Если мы хотим, чтобы документ был записан проведенным, то необходимо записывать его немного по-другому. Если раньше мы использовали метод Записать объекта документа без параметров, то теперь необходимо применять параметры этого метода. Данный метод имеет следующий синтаксис.

Записать(<РежимЗаписи>,<РежимПроведения>)

Оба параметра это системные перечисления. Первый параметр это перечисление РежимЗаписиДокумента, которое может принимать следующие значения:

РежимЗаписиДокумента.Запись
РежимЗаписиДокумента.Проведение
РежимЗаписиДокумента.ОтменаПроведения

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

Во втором параметр РежимПроведения необходимо указывать системное перечисление РежимПроведениеДокумента, которое может принимать следующие значения:

РежимПроведенияДокумента.Неоперативный
РежимПроведенияДокумента.Оперативный

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

Изменим запись нашего документа: пусть он проводится в оперативном режиме.

ДокПриход.Записать(РежимЗаписиДокумента.Проведение,
                   РежимПроведенияДокумента.Оперативный);

Теперь документ будет сразу проведен при создании.

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

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

Обработка изменения документа

Как и в прошлый раз, я создам обработчик команды на сервере и на клиенте. И в серверном обработчике напишу код получения объекта из ссылки документа.

&НаСервере
Процедура ИзменитьДокументНаСервере()

    ДокОбъект = ДокументПрихода.ПолучитьОбъект();

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

&НаКлиенте
Процедура ИзменитьДокумент(Команда)
    ИзменитьДокументНаСервере();
КонецПроцедуры

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

Изменим склад и проведем документ. В этот раз проведем в неоперативном режиме.

ДокОбъект = ДокументПрихода.ПолучитьОбъект();
ДокОбъект.Склад = Склад;
ДокОбъект.Записать(РежимЗаписиДокумента.Проведение,
                   РежимПроведенияДокумента.Неоперативный);


Открыть документ 1С программно

Научимся открывать документ 1С программно. Для этого мы доработаем предыдущую обработку: после изменения документа откроем основную форму этого объекта для просмотра и возможного редактирования. Для открытия формы документа, мы будем использовать метод  ОткрытьФорму, в котором будем использовать параметр Ключ, где укажем ссылку на открываемый документ.

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

&НаКлиенте
Процедура ИзменитьДокумент(Команда)
    ИзменитьДокументНаСервере();
    ПараметрыОткрытия = Новый Структура("Ключ",ДокументПрихода);
    ОткрытьФорму("Документ.ПриходТовара.ФормаОбъекта",
                 ПараметрыОткрытия,,,,,,
                 РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс);
КонецПроцедуры

Если мы сейчас выполним этот код, то откроется форма документа, с уже измененным реквизитом Склад.

Обработка изменения документа

Более подробно и основательно разработка в 1С дается в моей книге: «Программировать в 1С за 11 шагов»

Изучайте программирование в 1С в месте с моей книги «Программировать в 1С за 11 шагов»

  1. Книга написана понятным и простым языком — для новичка.
  2. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  3. Научитесь понимать архитектуру 1С;
  4. Станете писать код на языке 1С;
  5. Освоите основные приемы программирования;
  6. Закрепите полученные знания при помощи задачника;

О том как разрабатывать под управляемым приложением 1С, читайте в книге Книга «Основы разработки в 1С: Такси»

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

  1. Очень доступный и понятный язык изложения
  2. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  3. Поймете идеологию управляемого приложения 1С
  4. Узнаете, как разрабатывать управляемое приложение;
  5. Научитесь разрабатывать управляемые формы 1С;
  6. Сможете работать с основными и нужными элементами управляемых форм
  7. Программирование под управляемым приложением станет понятным

Промо-код на скидку в 15% — 48PVXHeYu

Вступайте в мои группы:

Вконтакте: https://vk.com/1c_prosto
Фейсбуке: https://www.facebook.com/groups/922972144448119/
ОК: http://ok.ru/group/52970839015518
Твиттер: https://twitter.com/signum2009

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