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


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

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

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

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

Документ "Развозка" будут использовать те же самые пользователи, которые будут работать со справочником "Автомобили", функционально они взаимосвязаны. Так что подсистемы выбираем те же, что и для справочника "Автомобили" — УправлениеЗакупками, УправлениеПродажами и УправлениеЗапасами.
Далее мы должны определить состав и структуру данных, которые будут использоваться в нашем новом документе. Как мы уже знаем, справочники имеют два постоянных реквизита по умолчанию: Код и Наименование. У документов также есть реквизиты по умолчанию. Это Номер и Дата. Остальные реквизиты мы создаем сами.
Список реквизитов и типы их значений приведены в табл. 3.2.
 
Внесите реквизиты из таблицы в список реквизитов вкладки Данные, как показано на рис. 3.26. Новый реквизит добавляется, как обычно, щелчком правой кнопкой мыши на заголовке реквизитов и выбором единственного пункта Добавить, после чего в окне свойств реквизита вносятся необходимые изменения.
В результате список реквизитов будет выглядеть так, как на рис. 3.26.
 
Как правило, документ содержит в себе не только шапку с общими реквизитами, но и табличную часть. Наш документ "Развозка" не будет исключением. Создадим для него табличную часть, в которую автоматически будет переноситься список номенклатуры развозимой расходной накладной (РеализацияТоваровУслуг) и количество. Эта табличная часть также должна будет распечатываться в виде товарно-транспортной накладной (ТТН) для водителя. Табличные части добавляем точно так же, как и реквизиты: в нижней части окна, там, где должен располагаться список табличных частей, щелкнем правой кнопкой мыши по заголовку Табличные части и выберем единственный пункт Добавить. Табличных частей у документа может быть несколько, но нам пока достаточно одной. Сделайте так, как показано на рис. 3.27.
 
Теперь, аналогично тому, как создавали реквизиты документа, создаем реквизиты табличной части. Щелкнем правой кнопкой мыши по заголовку ТТН, выберем пункт Добавить, а в выпадающем списке — пункт Реквизит табличной части.
Список реквизитов и типы их значений приведены в табл. 3.3.
 
После добавления всех реквизитов вкладка Данные должна выглядеть так, как показано на рис. 3.28.
 
Далее мы переходим на вкладку Нумерация. Делаем все, как показано на рис. 3.29.
  
Нам нужно, чтобы документы автоматически нумеровались системой при создании, причем номер был уникальным. Длина номера — 9 символов, этого нам вполне хватит. Тип номера — Строка, что означает, что допускаются номера с префиксом, например, так: Ф-0000089. Префиксы чаще всего назначаются для обозначения принадлежности к определенной фирме (при многофирменном учете). При желании мы можем назначить документу периодичность (раз в день, месяц, квартал или год нумерация будет начинаться сначала). Подобная периодичность нумерации регламентирована законодательно для некоторых документов бухгалтерской отчетности, например для налоговых накладных. Для нашего нового документа, нестандартного и к тому же "для служебного использования", подобная периодичность нумерации смысла не имеет, так что оставляем все как есть.

Далее на вкладке Журналы мы можем задать принадлежность нашего нового документа одному или нескольким журналам. Что такое журнал? Это "контейнер" для хранения списка документов. Точно по аналогии с картонной папкой или пластиковым файлом, в которых хранятся документы. Журнал сам по себе не является источником информации, однако предназначен для отображения хранимой информации в удобном для пользователя виде. Для нового документа надо бы завести отдельный журнал. Но пока мы его не завели, привяжем документ "Развозка" к журналу складских документов, как к наиболее близкому по типу и смыслу хранимой информации (рис. 3.30).

 

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

 

Для создания новой формы щелкнем по заголовку Формы правой кнопкой мыши и выберем единственный пункт Добавить. Нам предложат указать тип формы (рис. 3.32).
 
Пока что нам нужно создать обычную форму документа, так что оставим все так, как показано на рис. 3.32, и нажмем кнопку Готово. Как и в случае со справочником "Автомобили", для нашего нового документа система автоматически построит форму с реквизитами (рис. 3.33).
 
Если такая форма устраивает, можно оставить все как есть, в противном случае элементы формы можно разместить так, как удобно разработчику. Я оставил почти все, как было, переместив только поля Номер и Дата (рис. 3.34).
 
После создания формы нам нужно задать права на новый документ. На вкладке Права в верхней части окна перечислены доступные в конфигурации роли, а в нижней части — возможные действия с документом для выбранной роли (рис. 3.35).
 
Дадим права на работу с документом менеджеру по закупкам, менеджеру по продажам и кладовщику.
Следующим шагом на вкладке Интерфейсы зададим, в каких пользовательских интерфейсах будет использоваться документ "Развозка" (рис. 3.36).
 
Ну и, наконец, на вкладке Прочие мы можем перейти в модуль документа (модуль объекта) и в модуль менеджера одноименными кнопками (рис. 3.37).
 
Также доступ к модулям документа и менеджера можно получить из раскрывающегося меню кнопки Действия.
Первая часть формирования документа завершена. В дереве конфигурации, наравне со стандартными документами, появился вновь созданный документ "Развозка" со всеми своими реквизитами и формами (рис. 3.38).
 
Теперь нам нужно посмотреть, как выглядит наш документ в списке. Форму списка мы ему специально не создавали, журнала тоже пока нет, привязали к стандартному журналу, хотя большинства полей нового документа в журнале просто нет.
Список документов, доступный через меню Операции | Документы | Развозка, в режиме Предприятия выглядит не очень хорошо. Много лишних полей, автоматически вынесенных в список одно за другим (рис. 3.39).
 
Примерно аналогичным образом выглядит пробный документ "Развозка" в журнале складских документов: дата, номер, ни суммы, ни контрагента. Неудобно (рис. 3.40).
  
Чтобы вывести в журнале максимально информации для пользователей, лучше создадим новый журнал и графы в него вынесем такие, которые будут соответствовать реквизитам, нужным пользователю при просмотре списка документов.
Итак, найдем в дереве конфигурации раздел Журналы документов, щелкнем на нем правой кнопкой мыши и выберем единственный пункт контекстного меню — Добавить. Откроется окно, как на рис. 3.41.

 

Аналогично тому, как мы это делали для нового справочника и документа, заполните поля Имя, Синоним и Комментарий (рис. 3.42).

 
Как и для любого объекта, новый журнал документов должен принадлежать каким-то подсистемам. В данном случае — тем же самым, которым принадлежит документ "Развозка", который будет отображаться в нашем новом журнале (рис. 3.43).
 
Далее перейдите на вкладку Данные (рис. 3.44).
 
В верхней части окна расположен список документов, которые будут отображаться в нашем новом журнале. Список пока пуст. В нижней части окна находится список граф будущего журналы, графы также еще не заданы.
Сначала внесем в список регистрируемых документов документ "Развозка". Для этого нажимаем кнопку с изображением карандаша, расположенную в правом верхнем углу на рис. 3.44. Откроется окно выбора документов, в котором необходимо выбрать вносимые документы (рис. 3.45).
 
Выберем документ "Развозка" и нажмем кнопку OK. Теперь документ "Развозка" привязан к нашему новому журналу (рис. 3.46).
 
Теперь нужно добавить графы журнала. Щелкнем правой кнопкой мыши по одноименному заголовку в нижней части окна и выберем пункт Добавить или просто нажмем зеленую кнопку с плюсом там же. Будет создана новая графа, которой нужно приписать имя и привязать к конкретным данным. Делается это в окне свойств графы, в правой части экрана (появляется сразу при создании новой графы). Введем имя и синоним (рис. 3.47).
  
После этого здесь же, в окне свойств, привяжем графу к нужным данным, для чего нажмем кнопку с тремя точками в правой части строки Ссылки. Откроется окно выбора реквизита, причем в списке будут только реквизиты документа, который привязан к журналу (в нашем случае "Развозка"). Выберем графу Контрагент и нажмем кнопку OK (рис. 3.48).
 
Затем точно так же добавим остальные графы, привязывая к ним соответствующие реквизиты документа. Результат должен получиться таким, как показано на рис. 3.49.
 
После того как определились с графами, создадим форму нового журнала, по аналогии тому, как создавали форму справочника "Автомобили" и документа "Развозка". Перейдем на вкладку Формы (рис. 3.50).
 
Щелкнем правой кнопкой мыши по заголовку Формы и выберем пункт Добавить. Откроется конструктор формы журнала (рис. 3.51).
 
Оставим все, как показано на рис. 3.51, и нажмем кнопку Готово. Форма списка журнала "Развозка" будет выглядеть так, как показано на рис. 3.52.
 
Далее мы должны дать пользователям права на использование журнала. Выберем пользовательские роли в верхней части окна, а в нижней проставим допустимые для выбранной роли действия (рис. 3.53).
 
Затем пропишем использование журнала в пользовательских интерфейсах, как мы уже делали это ранее (рис. 3.54).
 
Создание журнала закончено, осталось доработать сам документ "Развозка". Откроем его, перейдем на вкладку Формы и в дополнение к уже имеющейся форме документа создадим форму списка. Форму списка по умолчанию мы уже видели на рис. 3.39 и сейчас ее немного подправим. В открывшемся окне конструктора формы выберем тип формы — Форма списка документа, после чего нажмем кнопку Готово (рис. 3.55).
 
После нажатия кнопки Готово будет создана форма списка документа, которую мы можем поправить вручную, как нам будет угодно, добавляя, удаляя или меняя местами колонки. Для того чтобы поменять местами колонки, их достаточно просто перетащить мышью, удерживая за заголовок колонки. Результат должен получиться примерно такой, как на рис. 3.56.
 
Теперь перейдите на вкладку Журналы нашего документа "Развозка". На рис. 3.30 мы отнесли документ "Развозка" к журналу складских документов, поскольку отдельный журнал еще не создали. На рис. 3.57 видно, что документ теперь привязан как к журналу складских документов, так и к журналу "Развозка".
 
Теперь, при желании, мы можем отключить документ от журнала складских документов, поскольку создали специализированный журнал. А можем и оставить, как есть.
Документ сконструирован, но до завершения работы над ним еще далеко. Сохраните конфигурацию и перейдите в режим Предприятия. Попробуйте создать пробный документ "Развозка", заполните его данными.
Я на тестовой базе сформировал нечто подобное (рис. 3.58).
 
При заполнении формы документа сразу бросаются в глаза недоработки.

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

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

3. В поле Адрес хорошо бы подтягивать значение фактического адреса контрагента.

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

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

6. Документ нельзя распечатать, а ведь планировалось печатать товарно-транспортную накладную.
Наша задача сейчас — реализовать первые пять пунктов из списка. Печатную форму мы сформируем чуть позже, в разделе, посвященном работе с печатными формами (макетами).
Перейдем снова в режим Конфигуратора и откроем форму документа "Развозка" (ранее на рис. 3.34 мы ее рассматривали). Делаем двойной щелчок мышью по полю Документ. Справа откроется окно свойств поля. Опустим ползунок прокрутки в самый низ этого окна и увидим раздел События. Он нам и нужен (рис. 3.59).

  


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

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

Процедура АдресВручнуюПриИзменении(Элемент)
// Вставить содержимое обработчика.
КонецПроцедуры 
А теперь переписываем модуль документа так, чтобы у нас получились две запол-
ненные процедуры и функция:

Функция ПолучитьАдресКонтрагента(Объект)
ФункцияВернет = "";
Запрос = Новый Запрос;
Запрос.Текст = "
|ВЫБРАТЬ РАЗРЕШЕННЫЕ
| КонтактнаяИнформация.Тип КАК Тип,
| КонтактнаяИнформация.Вид КАК Вид,
| КонтактнаяИнформация.Представление КАК Представление
|ИЗ
| РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
|ГДЕ
| КонтактнаяИнформация.Объект = &Объект";
Запрос.УстановитьПараметр("Объект", Объект);
РезультатПоиска = Справочники.ВидыКонтактнойИнформации.НайтиПоКоду("000000002");
Результат = Запрос.Выполнить().Выбрать();

Пока Результат.Следующий() Цикл
   Если Результат.Тип<>Перечисления.ТипыКонтактнойИнформации.Адрес Тогда
     Продолжить;
   КонецЕсли;   
Если Результат.Вид = РезультатПоиска Тогда
     ФункцияВернет = Результат.Представление;
     Прервать;
   Иначе
     ФункцияВернет = "";
   КонецЕсли;
КонецЦикла;
Возврат ФункцияВернет;
КонецФункции
Процедура ДокументПриИзменении(Элемент)
ЭлементыФормы.Контрагент.Значение = Документ.Контрагент.Ссылка;
   Если ЭлементыФормы.АдресВручную.Значение = Ложь Тогда
     ФАдрес = ПолучитьАдресКонтрагента(ЭлементыФормы.Контрагент.Значение);
     ЭлементыФормы.Адрес.Значение = ФАдрес;
   КонецЕсли;
КонецПроцедуры

Процедура АдресВручнуюПриИзменении(Элемент)
   Если ЭлементыФормы.АдресВручную.Значение = Истина Тогда
     ЭлементыФормы.Адрес.Значение = "";
   ИначеЕсли ЭлементыФормы.АдресВручную.Значение = Ложь Тогда
     ФАдрес = ПолучитьАдресКонтрагента(ЭлементыФормы.Контрагент.Значение);
     ЭлементыФормы.Адрес.Значение = ФАдрес;
   КонецЕсли;
КонецПроцедуры

Рассмотрим, что же мы такое написали.
В процедуре ДокументПриИзменении() мы заполняем поле Контрагент на форме, "вытягивая" его из реквизита Контрагент, выбранного документе. За это отвечает строка

ЭлементыФормы.Контрагент.Значение = Документ.Контрагент.Ссылка;

При этом, поскольку мы работаем с элементами формы, мы используем методы Значение и Ссылка.
Затем мы проверяем, установлен ли флажок АдресВручную (Истина) или нет (Ложь).
Если флажок не установлен (Ложь), то адрес мы заносим не вручную, и нам нужно записать его в поле Адрес из фактического адреса контрагента. Здесь есть нюанс — в типовых конфигурациях "1С:Предприятие 8.2" адрес в виде реквизитов документа не хранится, как это было в "1С:Предприятие 7.7".

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

В функции ПолучитьАдресКонтрагента() используется запрос, синтаксис которого мы рассмотрим в главе 4. Пока же поясним его принцип работы (если читатель знаком с языком запросов SQL, то логика запроса ему будет вполне понятна). В запросе мы выбираем тип контактной информации (адрес, телефон и т. п.), вид (юридический адрес или фактический, рабочий телефон или мобильный и т. п.) и представление (собственно контактная информация) из регистра сведений, при условии, что объект выборки равен переданному объекту (контрагенту). Запрос отбирает значение только типа "Адрес" и вида "000000002" (в справочнике контактной информации — код фактического адреса контрагента). В итоге функция возвращает найденный результат.

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

Процедура ДокументПриИзменении(Элемент)
ЭлементыФормы.Контрагент.Значение = Документ.Контрагент.Ссылка;
Если ЭлементыФормы.АдресВручную.Значение = Ложь Тогда
ФАдрес = ПолучитьАдресКонтрагента(ЭлементыФормы.Контрагент.Значение);
ЭлементыФормы.Адрес.Значение = ФАдрес;
КонецЕсли;
ТТН.Очистить();
Для Каждого ТекущаяСтрока Из Документ.Товары Цикл
НоваяСтрокаТТН = ТТН.Добавить();
НоваяСтрокаТТН.Товар = ТекущаяСтрока.Номенклатура;
НоваяСтрокаТТН.Количество = ТекущаяСтрока.Количество;
НоваяСтрокаТТН.ЕдиницаИзмерения = ТекущаяСтрока.ЕдиницаИзмерения;
КонецЦикла
КонецПроцедуры

Что мы добавили? Цикл, перебирающий табличную часть Товары документа, выбранного в поле формы Документ. При каждом проходе цикла создается новая строка в таблице ТТН, в поле Товар записывается значение ТекущаяСтрока.НоменклатураТекущаяСтрока — это строка документа, который перебирается циклом), так же из текущей строки документа в текущую строку ТТН записываются количества и единицы измерения. Перед циклом мы поставили команду ТТН.Очистить(), это сделано на случай, если пользователь выберет другой расходный документ на форме документа "Развозка". ТТН при этом нужно заполнить заново, а старые значения — удалить. Именно это мы и делаем.

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

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

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

Во-первых, его еще нельзя печатать. Во-вторых, хоть в нем и можно сохранять данные, но основной механизм хранения данных — регистры (а для бухгалтерских документов — проводки) — в нем никак не задействован. Далее в этой главе мы доработаем документ и устраним эти недостатки. Сейчас же давайте рассмотрим некоторые основные методы работы с документами. Для наглядности и отработки использования методов на практике перейдите в режим Предприятия и создайте несколько документов "Развозка".
Вот так у меня выглядят в списке созданные документы (рис. 3.61).

 

Похожие новости

Комментариев 0

Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.