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

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

Я
   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С:Предприятие • Обработка проверки заполнения • Проверяемые реквизиты • Реквизит • Управляемая форма

ДокументыМенеджер

Объект ДокументыМенеджер позволяет получить доступ ко всем менеджерам документов. Это можно сделать перебрав все менеджеры в цикле или обратившись к конкретному менеджеру по имени. Также данный объект позволяет проверить является ли ссылка ссылкой на какой-нибудь документ:

//получение конкретного менеджера документа по имени
МенеджерДокаПриход = Документы.ПриходТовара;
МенеджерДокаРасход = Документы["РасходТовара"];

//перебор всех менеджеров документа
Для Каждого МенеджерДока Из Документы Цикл
	Сообщить(МенеджерДока);	
КонецЦикла;	

СсылкаНаЧтото = ПолучитьСсылкуНаЧтото();

//проверка является ли ссылка ссылкой на документ
ВсеДоки = Документы.ТипВсеСсылки();
Если ВсеДоки.СодержитТип(ТипЗнч(СсылкаНаЧтото)) Тогда
	//это ссылка на документ
Иначе
	//что-то другое
КонецЕсли;

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

Чтобы программно создать документ нужно использовать метод менеджера документа СоздатьДокумент:

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


Программное заполнение документа

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

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

Программное заполнение табличной части документа

К табличной части документа можно обратиться по имени, через точку от объекта. Затем через метод Добавить добавить новую строку табличной части. К реквизитам строки можно обращаться по имени, через точку от строки. В целом работа с табличной частью документа похожа на работу с таблицей значений:

//создаем новый документ
ПриходныйДок = Документы.ПриходТовара.СоздатьДокумент();
//добавим несколько строк в табличную часть СписокТоваров
НоваяСтрТЧ = ПриходныйДок.СписокТоваров.Добавить();
НоваяСтрТЧ.Товар = СсылкаНаТоварОдин;
НоваяСтрТЧ.Количество = 18;

НоваяСтрТЧ = ПриходныйДок.СписокТоваров.Добавить();
НоваяСтрТЧ.Товар = СсылкаНаТоварДва;
НоваяСтрТЧ.Количество = 36;

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

//записываем в базу данных
ПриходныйДок.Записать();

Программное изменение документа

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

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


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

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

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

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

Программное удаление документа

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

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

//пометить на удаление
ПриходныйДок.УстановитьПометкуУдаления(Истина);

//снять пометку на удаление
ПриходныйДок.УстановитьПометкуУдаления(Ложь);

//удаление документа из базы
ПриходныйДок.Удалить();

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

У документа нет отдельного метода для проведения документа. Проведение — это запись документа с проведением. Для проведения документа используется метод Записать, в который параметром нужно передать режим записи документа. Всего есть три режима записи: запись, проведение, отмена проведения. Если параметр не указан, то используется запись:

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

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

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

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

Программная работа с движениями документа

Через свойство Движения можно обращаться к движениям проведенного документа и даже редактировать их. Рассмотрим на примере:

ДатаПоиска = ТекущаяДатаСеанса();
ПриходныйДок = Документы.ПриходТовара.НайтиПоНомеру("АА0000003", ДатаПоиска);

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

//перебор всех регистров, по которым выполняются движения документом
Для Каждого Рег Из ДвиженияДока Цикл
	Сообщить(Рег);
КонецЦикла;	

//количество регистров из коллекции движений
КолвоРег = ДвиженияДока.Количество(); 

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

Программный поиск документа

Чтобы программно найти документ можно использовать методы НайтиПоНомеру и НайтиПоРеквизиту менеджера документа.

НайтиПоНомеру

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

ДатаПоиска = Дата(2021,1,1);
//в настройках нумерации указана Периодичность = В пределах года
ПриходныйДок = Документы.ПриходТовара.НайтиПоНомеру("000000017", ДатаПоиска);
//поиск будет выполняться среди документов за 2021 год с номером 000000017

//в настройках нумерации указана Периодичность = В пределах месяца
ПриходныйДок= Документы.ПриходТовара.НайтиПоНомеру("000000017", ДатаПоиска);
//поиск будет выполняться среди документов за январь 2021 год с номером 000000017

//в настройках нумерации указана Периодичность = Непериодический
//дату можно не указывать
ПриходныйДок = Документы.ПриходТовара.НайтиПоНомеру("000000017");
//поиск будет выполняться среди всех документов

//если документ не найден, то в ПриходныйДок будет пустая ссылка
Если ПриходныйДок = Документы.ПриходТовара.ПустаяСсылка() Тогда
	//не нашли
ИначеЕсли ПриходныйДок = Неопределено Тогда
	//для документа указана нулевая длина номера
Иначе
	//ПриходныйДок - ссылка на документ
КонецЕсли;

НайтиПоРеквизиту

Метод НайтиПоРеквизиту принимает два параметра: имя реквизита и значение реквизита. Если реквизит имеет тип Строка, то поиск выполняется по точному соответствию. Нельзя искать по реквизиту с типом ХранилищеЗначения или неограниченная строка.

//поиск по реквизиту
//первый параметр - имя реквизита
//второй параметр - значение реквизита
ПриходныйДок = Документы.ПриходТовара.НайтиПоРеквизиту("Поставщик", СсылкаНаПоставщика);

//если документ не найден, то в ПриходныйДок будет пустая ссылка
Если ПриходныйДок = Документы.ПриходТовара.ПустаяСсылка() Тогда
	//не нашли
Иначе
	//ПриходныйДок - ссылка на найденный документ
	//если было несколько документов с таким значением реквизита, то 
	//будет найден первый попавшийся
КонецЕсли;

Выборка документов

Чтобы получить выборку документов можно воспользоваться методом Выбрать менеджера документа. Затем полученную выборку можно перебрать с помощью цикла Пока. На каждом витке цикла будут данные об одном документе. Через параметры метода можно ограничить выборку по периоду или по реквизитам.

//выборка всех документов
ВыборкаПриходов = Документы.ПриходТовара.Выбрать();
Пока ВыборкаПриходов.Следующий() Цикл
	//через выборку есть доступ ко всем реквизитам объекта
	Сообщить(ВыборкаПриходов.Номер);
	Сообщить(ВыборкаПриходов.Поставщик);
	//также через выборку можно получить объект
	ДокОбъект = ВыборкаПриходов.ПолучитьОбъект();
КонецЦикла;	

//выборка документов за 2 месяца
ВыборкаПриходов = Документы.ПриходТовара.Выбрать(Дата(2021,1,1), Дата(2021,2,28));

//выборка всех документов, у которых дата больше 1 марта 2021
ВыборкаПриходов = Документы.ПриходТовара.Выбрать(Дата(2021,3,1));

//выборка всех документов, у которых дата меньше 15 марта 2021
ВыборкаПриходов = Документы.ПриходТовара.Выбрать(, Дата(2021,3,15));

//выборка документов с конкретной датой 
ОтборДок = Новый Структура("Дата", Дата(2021,3,22));
ВыборкаПриходов = Документы.ПриходТовара.Выбрать(,, ОтборДок);

//выборка документов с конкретным значением реквизита 
ОтборДок = Новый Структура("Поставщик", СсылкаНаПоставщика);
ВыборкаПриходов = Документы.ПриходТовара.Выбрать(,, ОтборДок);

//выборка отсортированная по убыванию даты
ВыборкаПриходов = Документы.ПриходТовара.Выбрать(,,, "Дата Убыв");

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

Программная работа с ссылкой на документ

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

Поставщик = СсылкаНаДокПриход.Поставщик;
ДатаДок = СсылкаНаДокПриход.Дата;
//однако на клиенте такой код не сработает с ошибкой:
// поле объекта не обнаружено

Для получения пустой ссылки можно использовать метод ПустаяСсылка. Для проверки на пустую ссылку можно воспользоваться методом Пустая:

//получение пустой ссылки на документ
ПустойДокПриход = Документы.ПриходТовара.ПустаяСсылка();

//проверка на пустую ссылку
Если ПустойДокПриход.Пустая() Тогда
	//пустая ссылка
КонецЕсли;	
//или так
Если ПустойДокПриход = Документы.ПриходТовара.ПустаяСсылка() Тогда
	//тоже пустая ссылка
КонецЕсли;

Сопоставление документов по идентификатору

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

Пример выгрузки идентификатора документа. Уникальный идентификатор получается из ссылки методом УникальныйИдентификатор:

ВыборкаПриходов = Документы.ПриходТовара.Выбрать();
Пока ВыборкаПриходов.Следующий() Цикл
	//получаем уникальный идентификатор
	УИДПрихода = ВыборкаПриходов.Ссылка.УникальныйИдентификатор();
	//преобразуем в строку
	УИДПриходаСтрокой = Строка(УИДПрихода);
	//дальше записываем строку в файл обмена
КонецЦикла;	

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

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

Смотрите также:
Электронный учебник по программированию в 1С
Рекомендации по изучению программирования 1С с нуля
Игра «Кто хочет стать миллионером?» с вопросами на определенную тематику (язык программирования JavaScript, английские, немецкие, французские, испанские, португальские, ни­дер­ландские, итальянские слова, электробезопасность, промышленная безопасность, бокс и т.п.), написанная на 1С
Программирование в 1С 8.3 с нуля — краткий самоучитель
Комплексная подготовка программистов 1С:Предприятие 8.2
Сайты с уроками программирования и со справочниками
Youtube-каналы с уроками программирования
Сайты для обучения программированию
Лекции и уроки

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

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

Установка даты документа
При открытии формы нового документа, если дата документа не установлена (равна значению типа Дата по умолчанию), то документу устанавливается рабочая дата. Следует заметить, что используется именно рабочая дата, а не текущая (если не установлено использование текущей даты в качестве рабочей). Это дает возможность пользователю настроить рабочую дату так, чтобы новые документы вводились определенной датой. При этом в качестве даты устанавливается начало дня (дата без времени), даже если в качестве рабочей даты выступает текущая дата. Но если свойство АвтоВремя имеет значение НеИспользовать, и рабочая дата равна текущей, то устанавливается текущая дата, вместе со временем. Таким образом, для варианта АвтоВремя = НеИспользовать при открытии берется рабочая дата (если она отличается от текущей) или текущая дата вместе со временем, а для остальных вариантов установка времени откладывается на момент записи документа.

При записи нового документа в форме если свойство АвтоВремя имеет значение отличное от НеИспользовать, и не используется оперативное проведение, и время документа пустое (0:00:00), то выполняется автоматическая установка времени на основании значения свойства АвтоВремя. Действие расширения формы в этом случае аналогично вызову метода УстановитьВремя() с вариантом выбранном в свойстве АвтоВремя и с использованием журналов документа.

Расширение формы так же предоставляет команды для установки времени документа в начало дня, конец дня, перед предыдущим и за последующим документом.

Установка режима записи
При нажатии кнопки «ОК», если для документа в метаданных разрешено проведение, документ записывается в режиме проведения.

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

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

Установка режима оперативного проведения
При записи документа в форме, расширение формы выполняет установку режима проведения (оперативное или неоперативное проведение). Установка выполняется по следующему алгоритму.

Вначале если свойство ИспользоватьРежимПроведения имеет значение Авто выполняется первичный подбор режима проведения из вариантов Оперативный, Неоперативный и Запрашивать.

Если у пользователя нет права на неоперативное проведение – используется оперативное проведение.

Если документ не проведен – используется оперативное проведение.

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

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

Если дата документа равна текущей и время больше текущего – используется оперативное проведение.

Дальнейшие действия системы определяются уже исходя из трех вариантов (Оперативный, Неоперативный и Запрашивать) установленных непосредственно в свойстве ИспользоватьРежимПроведения или на основании описанного алгоритма для варианта Авто.

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

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

Если дата документа меньше текущей и используется режим Запрашивать, то в зависимости от наличия прав на неоперативное проведение или выбирается неоперативный режим (без запроса пользователя), или запись документа отменяется.

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

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

Полученный таким образом режим проведения (Оперативный или Неоперативный) используется при выполнении записи документа.

Проверка прав
При открытии формы документа, если документ проведен, а у пользователя нет права «Интерактивное изменение проведенных», то расширение переводит форму в режим ТолькоПросмотр.

При записи документа в форме выполняется проверка прав на интерактивное проведение и интерактивную отмену проведения в соответствии с текущим режимом записи.

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

В этой статье научимся приемами программного создания и заполнения документов в 1С 8.3, кроме того, мы узнаем, как программно записывать и проводить документ 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

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

Последовательность событий при записи нового документа из формы документа

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

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

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

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

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

Обработчики событий

Расширение управляемой формы для документа. Возникает на клиенте перед выполнением записи объекта из формы. Процедура-обработчик данного события вызывается перед вызовом процедуры-обработчика события ПередЗаписью .

  • Отказ , тип Булево . Признак отказа от записи. Если в теле процедуры-обработчика установить данному параметру значение Истина , запись выполнена не будет и будет вызвано исключение. Значение по умолчанию: Ложь .
  • ПараметрыЗаписи , тип Структура . Структура, содержащая параметры записи. Для формы документа существует два предопределенных параметра — РежимЗаписи и РежимПроведения . Они добавляются автоматически при вызове команд «Провести», «Провести и закрыть», «Отмена проведения». Параметр РежимПроведения может отсутствовать, если режим проведения в документе не определен.

Примечание: В обработчике данного события нельзя использовать серверные методы формы с директивой компиляции &НаСервере .

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

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

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

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

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

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

Расширение управляемой формы для документа. Возникает на сервере при записи объекта из формы. Процедура-обработчик вызывается после записи объекта (после события ПриЗаписи объекта) в базу данных, но до окончания транзакции записи.

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

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

  • ТекущийОбъект , тип ДокументОбъект.ИмяДокумента . Записываемый объект.
  • ПараметрыЗаписи , тип Структура . Структура, содержащая параметры записи. Для формы документа существует два предопределенных параметра — РежимЗаписи и РежимПроведения . Они добавляются автоматически при вызове команд «Провести», «Провести и закрыть», «Отмена проведения».

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

  • ПараметрыЗаписи , тип Структура . Структура, содержащая параметры записи. Для формы документа существует два предопределенных параметра — РежимЗаписи и РежимПроведения . Они добавляются автоматически при вызове команд «Провести», «Провести и закрыть», «Отмена проведения».

Примечание: В обработчике данного события нельзя использовать серверные методы формы с директивой компиляции &НаСервере .

Документ в 1С 8.3: настройка, проведение и формирование

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

1С:Документооборот. Антикризисный комплект для удаленной работы за 10 000 р.

Антикризисный комплект – набор сервисов для организации удаленной работы на 180 дней. Включает:

  • программу «1С:Документооборот КОРП» со встроенными функциями, которые нужны для удаленной работы сотрудников.
  • сервер 1С:Предприятия (x86-64);
  • 1С:Сервер взаимодействия;
  • клиентскую лицензию на 100 подключений.

Структура документа в 1С

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

Дата документа, то есть время – одна из ключевых характеристик в документах 1С. Благодаря этому можно легко узнать хронологический порядок создания документов и проследить всю цепочку по какому-то процессу.

В 1С:Бухгалтерия используются три вида документов: исходящие, входящие и внутренние. Для каждого документа прилагаются реквизиты, которые пользователь системы должен заполнить подробной информацией. Например, в документе типа «Заказ Поставщику» в обязательном порядке должно быть отражено наименования товара, склада, поставщика, а так же указан контрагент по операции и вид хозяйственной операции в системе.

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

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

Дополнительные сведения документа

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

В этом окне выберем вкладку «Дополнительные реквизиты и сведения» и поставим галочку в поле, которое так же называется. Затем переходим в меню «Администрирование-Формы-Дополнительные сведения».

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

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

Затем последуем на вкладку «Значения» и жмем на кнопку «Создать». Во всплывающем окне заполняем нужные пункты сведений.

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

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

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

Проведение документов в 1С

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

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

Формы документов в 1С

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

Если необходимо просмотреть весь список документов или только определенный тип в 1С существует «Форма списка». В этих списках можно легко отобрать нужные документы, быстро изменить их или произвести поиск данных.

Макеты документов в 1С

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

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

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

Как перепровести документы в 1С Бухгалтерия 8.3?

Подробная инструкция «Как перепровести документы в 1С Бухгалтерия 8.3?».

Содержание:

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

Рассмотрим, чем они отличаются.

  • Записать — документ сохраняется в базе, но не делает проводок.
  • Провести — документ будет сохранен и проведен, то есть будут сформированы проводки. Это влияет на деятельность организации.
  • Провести и закрыть — здесь работают те же правила, что и для кнопки “Провести”, но карточка документа при этом закроется.

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

1. Настройка проведения документов

Вначале разберем, какие есть настройки проведения документов. Откроем меню “Администрирование”, далее в подразделе “Настройки программы” выберем пункт “Проведение документов”:

Здесь есть настройки, которые влияют на проведение.

1. Когда выполнять расчеты. Можно выбрать вариант “При закрытии месяца” — тогда документы будут сохраняться быстрее, а все расчеты будут сделаны в конце месяца. При выборе другого варианта расчеты будут выполняться при каждом проведении документов.

2. Проверять проведение документов при формировании отчетов — при установленном флажке для некоторых отчетов перед формированием могут перепроводится документы. Например, для отчета “Оборотно-сальдовая ведомость”.

2. Как перепровести все документы в 1С Бухгалтерия 8.3

2.1 При закрытии месяца

Программа при закрытии месяца сама предлагает провести документы, если порядок нарушен. К закрытию месяца можно перейти из раздела “Операции”:

Нажмем на ссылку “Перепроведение документов”.

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

В результате окно примет вид:

2.2 Без закрытия месяца

Документы можно перепровести и без закрытия месяца. Откроем меню “Операции”, далее в подразделе “Сервис” выберем пункт “Групповое перепроведение документов”:

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

3. Как перепровести документы определенного типа

Бывают ситуации, когда нам нужно провести не все документы, а только некоторые. Для этого зайдем в меню “Все функции”:

Затем в разделе “Стандартные” выберем пункт “Проведение документов”:

Рассмотрим, как тут работать.

1. Сначала нажимаем на ссылку “Период”:

Вводим период и нажимаем “Выбрать”:

2. Далее нужно выбрать один или несколько документов для перепроведения в разделе “Доступные документы”. Например, найдем документ “Списание с расчетного счета”. Переносим его в раздел “Выбранные документы” по кнопке “Добавить”:

3. Определим, какие дополнительные флажки нам нужны. Можно изменять уже проведенные документы или провести непроведенные. Установим оба флажка:

Нажимаем “Провести”. Выйдет сообщение с результатами:

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

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

Откроем список документов “Реализация (акты, накладные”). Здесь мы можем быстро перепровести документы за два шага:

1. Выделяем документы, которые хотим провести:

a) можно выделить все документы по комбинации клавиш Ctrl + A;

b) можно выделить несколько документов подряд. Встаем курсором на документ, зажимаем клавишу Shift и нажимаем на любой документ выше или ниже. В результате будут выделены документы:

c) можно выделить документы выборочно. Для этого встаем курсором на документ, зажимаем клавишу Ctrl и не отпуская клавишу встаем курсором поочередно на другие нужные документы в списке:

2. После выделения документов нажимаем на любом выделенном документе правой кнопкой мыши и выбираем пункт “Провести”:

В правом нижнем углу начнется перепроведение выбранных документов:

Этим способом можно перепровести любые документы в 1С Бухгалтерия 8.3.

Вы можете работать в 1С Бухгалтерия в облаке — 1С ФРЕШ. Попробуйте 14 дней и оцените сами.

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