В этой статье научимся приемами программного создания и заполнения документов в 1С 8.3, кроме того, мы узнаем, как программно записывать и проводить документ 1С, а также узнаем, как программно открыть основную форму документа.
Прежде чем мы начнем разбирать вопросы программной работы с документами в 1С 8.3, хочу обратить Ваше внимание, что на управляемой форме в режиме тонкого клиента мы можем программно работать (создавать, записывать и проводить) с документами только в серверном контексте. То есть, ваша процедура или функция должна выполняться под директивами &НаСервере или &НаСервереБезКонтекста.
Все примеры в этой статье я буду показывать на управляемой форме обработки, которую создал «за кадром».
Создать документ 1С программно
В моей учебной конфигурации 1С имеется простенький документ с небольшим набором реквизитов, а также с одной табличной частью.
Для программного создания документов, я сделал обработку. У этой обработки , я разработал форму и создал команду управляемой формы, которую назвал «Создать документ прихода», поместив её на форму обработки.
Для этой команды, я сделаю обработчики на клиенте и на сервере.
В серверном обработчике мы и напишем код, который и будет создавать документ..
&НаСервере Процедура СоздатьДокументПриходаНаСервере() ДокПриход = Документы.ПриходТовара.СоздатьДокумент(); КонецПроцедуры &НаКлиенте Процедура СоздатьДокументПрихода(Команда) СоздатьДокументПриходаНаСервере(); КонецПроцедуры
В этом коде я обратился к менеджеру документа ПриходТовара (строка Документы.ПриходТовара), и использовал функцию менеджера документа СоздатьДокумент, которая и создает документ-объект. Переменная ДокПриход, которую мы создали будет иметь тип ДокументОбъект.ПриходТовара.
Следующим шагом, я присвою дату этому документу, для простоты, это будет текущая дата.
ДокПриход = Документы.ПриходТовара.СоздатьДокумент(); ДокПриход.Дата = ТекущаяДата();
Номер я присваивать не буду, потому что у объекта моего документа включено свойство Автонумерация.
В принципе, этого вполне достаточно, чтобы наш документ существовал. Но создав его при помощи функции СоздатьДокумент, мы не записали его непосредственно в базу. После выполнения кода выше, ни какого документа в базе не появится!
Записать документ 1С программно
Для того, чтобы документ 1С появился в базе, его необходимо записать. Делается это при помощи метода документа-объекта Записать. Этот метод позволяет и записать, и провести документ. Он имеет два параметра, которые я разберу ниже. Но, метод Записать также можно использовать и без параметров, тогда он будет просто записывать документ. Что мы и сделаем.
ДокПриход = Документы.ПриходТовара.СоздатьДокумент(); ДокПриход.Дата = ТекущаяДата(); ДокПриход.Записать();
Все теперь документ появится в базе.
Мы его можем создать, и это будет абсолютно пустой документ, без всяких реквизитов и без заполненной табличной частью.
Для того, чтобы что-то в нем появилось, нам необходимо заполнить этот документ.
Заполнить документ 1С программно
У нашего документа два реквизита «шапки» – Склад и Комментарий. Создадим на форме обработки реквизит управляемой формы Склад с соответствующим типом, для последующей записи его в шапку документа, а реквизит комментарий заполним в ручную.
Присвоим реквизитам созданного объекта-документа нужные значения, просто обратившись через точку к этим реквизитам.
ДокПриход = Документы.ПриходТовара.СоздатьДокумент(); ДокПриход.Дата = ТекущаяДата(); ДокПриход.Склад = Склад; ДокПриход.Комментарий = "#Документ создан автоматически обработкой" ДокПриход.Записать();
Так мы заполнили реквизиты «шапки», но у нас имеется еще табличная часть документа, необходимо заполнить и её. Для её заполнения, я создам таблицу значений в качестве реквизита формы обработки, и помещу её на эту форму.
Мы будем в цикле обходить эту таблицу значений, создавая в каждой итерации цикла новую строку табличной части документа и заполняя её данными.
ДокПриход = Документы.ПриходТовара.СоздатьДокумент(); ДокПриход.Дата = ТекущаяДата(); ДокПриход.Склад = Склад; ДокПриход.Комментарий = "#Документ создан автоматически обработкой"; Для Каждого стрТЗ Из ТЗ Цикл НовСтрТЧДокумента = ДокПриход.СписокТоваров.Добавить(); НовСтрТЧДокумента.Номенклатура = стрТЗ.Номенклатура; НовСтрТЧДокумента.Количество = стрТЗ.Количество; НовСтрТЧДокумента.Цена = стрТЗ.Цена; НовСтрТЧДокумента.Сумма = НовСтрТЧДокумента.Количество*НовСтрТЧДокумента.Цена; КонецЦикла; ДокПриход.Записать();
В этом коде я обращаюсь к табличной части документа-объекта посредством точки (строка ДокПриход.СписокТоваров), получаю табличную часть этого объекта, и используя метод Добавить, создаю новую строку табличной части. А потом заполняю реквизиты табличной части документа данными из таблицы значений. Поскольку у нас названия реквизитов табличной части и таблицы значений совпадают, мы можем упростить код заполнения табличной части, используя метод ЗаполнитьЗначенияСвойств.
Для Каждого стрТЗ Из ТЗ Цикл НовСтрТЧДокумента = ДокПриход.СписокТоваров.Добавить(); ЗаполнитьЗначенияСвойств(НовСтрТЧДокумента,стрТЗ); НовСтрТЧДокумента.Сумма = НовСтрТЧДокумента.Количество*НовСтрТЧДокумента.Цена; КонецЦикла;
Всё! Мы можем смело создать документ, который будет заполнен.
Провести документ 1С программно
Все документы, которые мы создавали ранее были не проведены. Если мы хотим, чтобы документ был записан проведенным, то необходимо записывать его немного по-другому. Если раньше мы использовали метод Записать объекта документа без параметров, то теперь необходимо применять параметры этого метода. Данный метод имеет следующий синтаксис.
Записать(<РежимЗаписи>,<РежимПроведения>)
Оба параметра это системные перечисления. Первый параметр это перечисление РежимЗаписиДокумента, которое может принимать следующие значения:
РежимЗаписиДокумента.Запись РежимЗаписиДокумента.Проведение РежимЗаписиДокумента.ОтменаПроведения
Т.е. мы можем записать документ, провести документ и отменить проведение документа.
Во втором параметр РежимПроведения необходимо указывать системное перечисление РежимПроведениеДокумента, которое может принимать следующие значения:
РежимПроведенияДокумента.Неоперативный РежимПроведенияДокумента.Оперативный
Т.е. мы можем провести документ как в оперативном режиме, так и в неоперативном. Если этот параметр не указан, то документ проводится в неоперативном режиме.
Изменим запись нашего документа: пусть он проводится в оперативном режиме.
ДокПриход.Записать(РежимЗаписиДокумента.Проведение, РежимПроведенияДокумента.Оперативный);
Теперь документ будет сразу проведен при создании.
Изменить документ 1С программно
Часто возникают задачи, когда нужно поменять уже созданный документ, или провести документ, который был только записан. Для этого необходимо из ссылки на документ получить его объект. Для примера, я опять создам «за кадром» новую обработку, на форме которой размещу ссылку на документ, поле с типом Склад и команду. При выполнение этой команды, будет меняться склад документа, а потом этот документ будет проводиться.
Как и в прошлый раз, я создам обработчик команды на сервере и на клиенте. И в серверном обработчике напишу код получения объекта из ссылки документа.
&НаСервере Процедура ИзменитьДокументНаСервере() ДокОбъект = ДокументПрихода.ПолучитьОбъект(); КонецПроцедуры &НаКлиенте Процедура ИзменитьДокумент(Команда) ИзменитьДокументНаСервере(); КонецПроцедуры
Мы получили объект документа, используя метод ссылки на документ ПолучитьОбъект. Имейте в виду, что этот метод можно использовать или на сервере, или клиенте в режиме толстого клиента. Переменная, которую мы создали будет иметь тип ДокументОбъект.ПриходТовара.
Изменим склад и проведем документ. В этот раз проведем в неоперативном режиме.
ДокОбъект = ДокументПрихода.ПолучитьОбъект(); ДокОбъект.Склад = Склад; ДокОбъект.Записать(РежимЗаписиДокумента.Проведение, РежимПроведенияДокумента.Неоперативный);
Открыть документ 1С программно
Научимся открывать документ 1С программно. Для этого мы доработаем предыдущую обработку: после изменения документа откроем основную форму этого объекта для просмотра и возможного редактирования. Для открытия формы документа, мы будем использовать метод ОткрытьФорму, в котором будем использовать параметр Ключ, где укажем ссылку на открываемый документ.
&НаСервере Процедура ИзменитьДокументНаСервере() ДокОбъект = ДокументПрихода.ПолучитьОбъект(); ДокОбъект.Склад = Склад; ДокОбъект.Записать(РежимЗаписиДокумента.Проведение, РежимПроведенияДокумента.Неоперативный); КонецПроцедуры &НаКлиенте Процедура ИзменитьДокумент(Команда) ИзменитьДокументНаСервере(); ПараметрыОткрытия = Новый Структура("Ключ",ДокументПрихода); ОткрытьФорму("Документ.ПриходТовара.ФормаОбъекта", ПараметрыОткрытия,,,,,, РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс); КонецПроцедуры
Если мы сейчас выполним этот код, то откроется форма документа, с уже измененным реквизитом Склад.
Более подробно и основательно разработка в 1С дается в моей книге: «Программировать в 1С за 11 шагов»
Изучайте программирование в 1С в месте с моей книги «Программировать в 1С за 11 шагов»
- Книга написана понятным и простым языком — для новичка.
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Научитесь понимать архитектуру 1С;
- Станете писать код на языке 1С;
- Освоите основные приемы программирования;
- Закрепите полученные знания при помощи задачника;
О том как разрабатывать под управляемым приложением 1С, читайте в книге Книга «Основы разработки в 1С: Такси»
Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.
- Очень доступный и понятный язык изложения
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Поймете идеологию управляемого приложения 1С
- Узнаете, как разрабатывать управляемое приложение;
- Научитесь разрабатывать управляемые формы 1С;
- Сможете работать с основными и нужными элементами управляемых форм
- Программирование под управляемым приложением станет понятным
Промо-код на скидку в 15% — 48PVXHeYu
Вступайте в мои группы:
Вконтакте: https://vk.com/1c_prosto
Фейсбуке: https://www.facebook.com/groups/922972144448119/
ОК: http://ok.ru/group/52970839015518
Твиттер: https://twitter.com/signum2009
Ошибки в падежах и склонениях. Типично для 1Совца.
Судя по этой статье, здесь много что выкинуто за кулису и непонятно. Если и книжки так написаны, то зачем они нужны, тем более новичкам?!?
Это классика: 99% «профессоров» пишут книжки для себя, хотя утверждают обратное. Молодец, написал сам себе памятку. Подсчёт суммы в первом варианте неправильный из-за округления.
Всё названо одинаково и реквизиты и элементы….всё по 1Совски, чтобы вообще нихера не понять.
До УЧИТЕЛЯ дорасти надо, хотя при капитализме каждый суслик мнит себя агрономом.
Одинаковые имена для реквизитов и элементов — это норма. Любую типовую открой и посмотри, как там сделано.
И о какой ошибке округления идет речь? Ты что здесь округлять собрался? В момент записи значения в поле Сумма округление производится автоматически в соответствие с заданной точностью в Конфигураторе.
По поводу книг. Читал книгу «Программировать в 1С за 11 шагов», книга написана очень понятным и доступным языком. Это первая книга, читая которую, я начал что-то понимать в 1С.
Ильяс, спасибо за статью. Что касается падежей — это не самое страшное. Плохо то, что сразу нарисовываются какие — то «умники», которых будут волновать округления и падежи. А вот если бы в статье о программной работе с документами учитывались округления, попытки, исключения — это была бы действительно статья типичного 1С — ника, которых полно и толку от которой — ноль. Не обращай на таких внимания. Основная масса, к сожалению, такая.
Падежи можно, конечно, и пропустить. Хотя, лучше все эти склонения и жиши перепроверить. Читающие оценят. Однако, ошибка в округлении — выдаёт безалаберность в прикладной области. Это важно. Автору — радуйтесь поддержке, но обращайте особое внимание на критику, она делает Вас лучше.
Ты где здесь ошибку в округлении нашел?
Ну и запятые проверь у себя в сообщении.
Как обработкой создать сразу много документов?чтобы данные табЧасти заполнялись например,из самописного регистра или табличногодок-та?на каждую строчку новый документ?
Ильяс, спасибо за статью! Всё доступно и понятно!
«Программировать в 1С за 11 шагов», прочел! Как пишут выше, что книга «ниочем и все убрано за кулису», все не так! Для меня книга как шпаргалка, и написана легче для понимания чем «ХрусталевРадченко», плюсом короткие видосы на канале — в общем и целом ресурс для начинающего хороший отличный. Ильяс, СПАСИБО ! очень помогает твой труд.
а если надо в процедуре прочитать содержимое уже проведенного документа, выдернуть оттуда строчки?