Загрузка данных


План видов характеристик
ЗАНЯТИЕ 14
На этом занятии мы познакомимся с новым объектом конфигурации
План видов характеристик и узнаем, каким образом можно использовать этот объект для расширения возможностей нашей конфигурации.
Постановка задачи
Задача, которую мы перед собой поставим, будет заключаться в
следующем: мы создадим механизм, позволяющий пользователю
произвольным образом описывать материалы и, что самое главное,
вести учет в разрезе всех тех описаний, которые могут быть заданы
пользователем.
Описывать материалы пользователь сможет следующим образом: для
каждого материала будет возможность создать некоторые (произвольные) характеристики этого материала (например, цвет, производитель и пр.). Затем при поступлении материалов можно будет
задать конкретные значения интересующих характеристик (например,
при поступлении электрических кабелей можно будет указать, что они
белого цвета и их сечение равно 2,5 мм², а при поступлении резиновых
шлангов указать, что они черного цвета и произведены на фирме
«Fagumit Sp. z o.o.»).
В дальнейшем всегда можно будет получить информацию о том,
сколько и каких материалов есть у нас, скажем, белого цвета или
сколько было израсходовано черных резиновых шлангов.
Поскольку заранее неизвестно, какими именно характеристиками
пользователь захочет описать тот или иной материал, мы должны
предоставить ему некоторый механизм, позволяющий создавать
любые характеристики и, что самое важное, указывать, какой тип
значения должен быть у этих характеристик. Тогда при задании
значений определенной характеристики пользователь сможет
выбирать значения строго в соответствии с указанным типом.
Такую возможность описания характеристик как раз и обеспечивает
объект конфигурации План видов характеристик, с которым мы сейчас
познакомимся.
Что такое план видов характеристик
Объект конфигурации План видов характеристик предназначен для
описания структуры хранения информации о характеристиках,
создаваемых пользователем. На основе объекта конфигурации План
видов характеристик платформа создает в базе данных набор таблиц, в
которых будет храниться информация о существующих видах характеристик и типе значения характеристики каждого вида.
В сущности, план видов характеристик очень напоминает справочник,
однако имеет более узкую «специализацию»: хранит, по сути, информацию только о том, какими видами характеристик может описываться какой-либо объект базы данных.
План видов характеристик состоит из видов характеристик. Каждый
вид характеристики обязательно описывается наименованием и типом
значения.
Разработчик и, что самое важное, пользователь могут задать в нем
любое необходимое им количество видов характеристик (рис. 15.1).
Рис. 15.1. План видов характеристик в конфигураторе, в
базе данных и в режиме «1С:Предприятие»
Для того чтобы разработчик мог задать некий набор возможных типов
значений, которые могут принимать виды характеристик, у объекта
конфигурации План видов характеристик существует свойство Тип
значения характеристик.
Это свойство определяет составной тип данных, куда входят все типы,
которые могут понадобиться при указании типа значения характеристики (рис. 15.2).
Рис. 15.2. Свойство «Тип значения характеристик»
Кроме этого, может случиться так, что пользователю станет недостаточно тех типов данных, которые существуют в конкретной конфигурации.
Например, он захочет вести учет в разрезе цвета товаров, а справочник Цвет в конфигурации отсутствует.
В этом случае он сможет воспользоваться специальным вспомогательным справочником, который разработчик создаст заблаговре-
менно и укажет в качестве свойства объекта конфигурации План
видов характеристик – Дополнительные значения характеристик (рис.
15.3).
Рис. 15.3. Свойство «Дополнительные значения характеристик»
Тогда пользователь, создав новый вид характеристики Цвет, сможет
задать необходимые значения цвета в справочнике дополнительных
значений характеристик.
Примечательно, что этот справочник является подчиненным плану
видов характеристик. Таким образом, если затем пользователь
пожелает создать новый вид характеристик Запах и его значения, он
будет создавать их в том же самом справочнике дополнительных
характеристик, и они не будут «смешиваться» со значениями цвета.
УЗНАЙ БОЛЬШЕ!
О структуре объектов встроенного языка, предназначенных для
работы с планами видов характеристик, можно прочитать в разделе
«Краткий справочник разработчика. Планы видов характеристик».
План видов характеристик не имеет внутренних предопределенных
механизмов привязки вида характеристики к тому объекту, который
он должен описывать. Он лишь предоставляет возможность разработчику и пользователю описать некий набор характеристик и задать
их тип.
Каким образом хранить соответствие конкретного вида характеристик или значения характеристик конкретному объекту базы данных,
решает сам разработчик в зависимости от создаваемого прикладного
решения.
С точки зрения реализации пример, который мы будем рассматривать
далее, не является простым.
Поэтому сначала мы объясним логическую связь между объектами,
которые будут использоваться в этом примере.
Логическая связь объектов
Для реализации этого примера нам понадобятся три новых объекта
конфигурации.
Прежде всего, это План видов характеристик. Он будет хранить виды
характеристик, которыми в принципе можно описывать материалы.
Кроме этого, нам понадобится специальный справочник, подчиненный справочнику Номенклатура. Элементы этого справочника
будут идентифицировать партии материалов с некоторым фиксированным набором значений характеристик.
И третий объект – это регистр сведений, в котором собственно и будет
храниться соответствие конкретных значений характеристик некоторому варианту материала (см. рис. 15.4).
Рис. 15.4. Логическая связь объектов
В результате использования такой логической структуры объектов мы
получим возможность описывать каждую поступающую партию
материала любым количеством видов характеристик, поскольку это
соответствие будет храниться в регистре сведений.
И вместе с этим мы получим возможность вести учет в разрезе видов
характеристик, добавив в регистры накопления еще одно измерение
для хранения ссылки на элемент справочника, подчиненного справочнику Номенклатура (рис. 15.4).
В результате для того, чтобы узнать остатки материалов, обладающих
некоторым значением характеристики, достаточно будет выбрать из
регистра сведений все элементы подчиненного справочника с этим
значением характеристики и затем по ним и их владельцам получить
остатки регистра накопления.
Создание новых объектов конфигурации В
режиме «Конфигуратор»
Как мы уже говорили, нам понадобится создать несколько новых
объектов конфигурации:
 справочник ВариантыНоменклатуры, чтобы описывать партии
материалов;
 справочник ДополнительныеСвойстваНоменклатуры, чтобы задавать значения видов характеристик, для которых нет подходящих
типов в конфигурации;
 план видов характеристик СвойстваНоменклатуры, чтобы создавать виды характеристик;
 регистр сведений ЗначенияСвойствНоменклатуры, чтобы хранить
значения видов характеристик для различных партий материалов.
Сначала создадим объект конфигурации Справочник с именем
ВариантыНоменклатуры и укажем, что он будет подчинен справочнику Номенклатура. Для этого на закладке Владельцы добавим
справочник Номенклатура в список владельцев справочника
ВариантыНоменклатуры.
Затем создадим еще один объект конфигурации Справочник с именем
ДополнительныеСвойстваНоменклатуры.
После этого создадим объект конфигурации План видов характеристик с именем СвойстваНоменклатуры.
Установим его свойство Тип значения характеристик.
Для этого нажмем кнопку выбора и зададим составной тип данных
следующим образом (рис. 15.5):
 Число, длина 15, точность 3;
 Строка, длина 25;
 Дата;
 Булево;
 СправочникСсылка.ДополнительныеСвойстваНоменклатуры.
Рис. 15.5. Определение составного типа данных
для типа значения характеристик плана видов характеристик
Затем справочнику ДополнительныеСвойстваНоменклатуры укажем
владельца – план видов характеристик СвойстваНоменклатуры (рис.
15.6).
Рис. 15.6. Установка владельца справочника
После этого определим, что дополнительные значения характеристик
плана видов характеристик будут располагаться в справочнике ДополнительныеСвойстваНоменклатуры (рис. 15.7).
Рис. 15.7. Окно редактирования плана видов характеристик
Теперь создадим объект конфигурации Регистр сведений с именем
ЗначенияСвойствНоменклатуры.
На закладке Данные создадим измерения регистра:
 НаборСвойств, Ведущее, тип СправочникСсылка.ВариантыНоменклатуры;
 ВидСвойства, тип ПланВидовХарактеристикСсылка.СвойстваНоменклатуры.
Затем создадим ресурс регистра (рис. 15.8):
 Значение, тип Характеристика.СвойстваНоменклатуры.
Рис. 15.8. Окно редактирования регистра сведений
Обратите внимание, что мы имеем возможность определить тип
значения ресурса регистра как Характеристика.<имя>. По сути, это
определение представляет собой составной тип данных, как он задан в
типе значения соответствующего плана видов характеристик. То есть
ресурс регистра может иметь значение любого типа из тех, которые
описаны в типе значения плана видов характеристик.
Кроме этого, зададим в свойстве Связь по типу этого ресурса
измерение регистра ВидСвойства. Связь по типу будет обеспечивать
нам соответствие типа значений, вводимых в это поле, и типа характеристики, выбранной в поле Вид свойства. А также заполним еще
одно свойство – Связи параметров выбора.
Для этого нажмем кнопку выбора у этого свойства и перенесем
из списка доступных реквизитов в список параметров измерение
регистра ВидСвойства.
Установка свойства Связи параметров выбора обеспечит нам то, что
при выборе значений, содержащихся в справочнике Дополнительные
свойства номенклатуры, для выбора будут предлагаться только те
значения, которые относятся к выбранной характеристике, а не все,
которые есть в этом справочнике (рис. 15.9).
Рис. 15.9. Свойство ресурса «Значение регистра сведений»
Описание характеристик вариантов номенклатуры
В заключение для справочника ВариантыНоменклатуры опишем, где
хранятся свойства вариантов номенклатуры и как получить значения
этих свойств. Это описание платформа будет использовать автоматически при выполнении отчетов и при формировании различных динамических списков, в которых задействуются варианты номенклатуры.
В контекстном меню справочника ВариантыНоменклатуры выберем
команду Характеристики (рис. 15.10).
Рис. 15.10. Переход к характеристикам справочника
«ВариантыНоменклатуры»
Откроется диалог описания характеристик. С помощью кнопки
Добавить в командной панели добавим в него новую запись. В
качестве источника характеристик выберем план видов характеристик СвойстваНоменклатуры. Платформа автоматически определит,
что полем ключа будет являться поле Ссылка этого объекта конфигурации (рис. 15.11).
Рис. 15.11. Описание источника видов характеристик
Два оставшихся поля, Поле отбора видов и Значение отбора, оставим
пустыми. В нашем случае эти поля не понадобятся.
Перейдем к описанию того, где и как хранятся значения наших
свойств. В качестве источника значений характеристик выберем
регистр сведений ЗначенияСвойствНоменклатуры. Платформа автоматически определит, что в этом регистре полем объекта является
измерение НаборСвойств, а полем вида – измерение ВидСвойства.
Поэтому единственное, что нам останется указать самостоятельно, что
значения свойств хранятся в ресурсе Значение. В результате описание
характеристик для справочника ВариантыНоменклатуры будет
выглядеть следующим образом (рис. 15.12).
Рис. 15.12. Описание характеристик для справочника
«ВариантыНоменклатуры»
Доработка объектов конфигурации
Итак, мы создали новые объекты конфигурации и задали их основные
свойства, необходимые для реализации нашей задачи.
Но, как мы дальше увидим, не все свойства нас полностью устраивают. И вообще при разработке невозможно предусмотреть все
заранее. Часто какие-то недочеты становятся видны лишь в процессе
работы. То есть, увидев промежуточный результат в режиме
1С:Предприятие, важно уметь оценить недостатки и исправить их
прямо по ходу работы.
Поэтому на этом занятии мы продемонстрируем процесс разработки
от обратного. Это тоже очень ценный опыт, который, мы надеемся,
будет полезен читателю.
Итак, запустим «1С:Предприятие» в режиме отладки и посмотрим, как
взаимодействуют логически связанные объекты конфигурации
Справочник Номенклатура, Справочник ВариантыНоменклатуры,
План видов характеристик СвойстваНоменклатуры и Регистр сведений
ЗначенияСвойствНоменклатуры.
Обратите внимание, что мы не указывали для этих объектов
подсистем, к которым они относятся. Дело в том, что отображение
этих объектов вне их логической связи друг с другом не имеет особого
смысла. Поскольку мы задали владельцев справочников, ведущее
измерение регистра сведений и т. п., то нужные объекты
автоматически попадут в панель навигации форм своих владельцев как
подчиненная информация.
Поэтому проигнорируем появившееся системное сообщение об
отсутствии привязки созданных нами объектов к подсистемам.
Справочник «Варианты номенклатуры»
В режиме «1С:Предприятие»
Итак, по условию нашей задачи мы хотим создать наборы свойств и
составляющие их характеристики для отдельных элементов номенклатуры. Наборы свойств, как мы уже говорили, будут храниться в
справочнике ВариантыНоменклатуры, подчиненном справочнику
Номенклатура.
Сначала мы хотим создать набор свойств для элемента номенклатуры
Кабель электрический.
В разделе Учет материалов откроем справочник Номенклатура и его
элемент Кабель электрический из группы Материалы > Прочее.
Поскольку справочник Номенклатура является владельцем справочника ВариантыНоменклатуры, мы видим в панели навигации формы
ссылку для перехода к подчиненному списку. Это значит, что при
открытии этого списка мы будем видеть только наборы свойств, относящиеся к редактируемому элементу справочника Номенклатура.
Для этого выполним команду Варианты номенклатуры для перехода к
списку, где будут храниться наборы свойств элементов номенкла-туры
(рис. 15.13).
Рис. 15.13. Список вариантов номенклатуры
Открывшаяся форма списка вариантов номенклатуры не совсем нас
устраивает – столбцы Код и Владелец явно лишние.
Код нового варианта номенклатуры генерируется автоматически и ни
о чем пользователю не говорит.
Владелец варианта номенклатуры отражен в заголовке формы и тоже
в списке не имеет смысла.
Чтобы сделать эти колонки невидимыми, нам нужно создать форму
списка справочника ВариантыНоменклатуры и при ее создании проанализировать, откуда она открывается (это можно понять по значению
параметра формы Отбор).
Если установлен отбор по владельцу (то есть она открывается из
списка номенклатуры), то мы будем в ней скрывать колонки Код и
Владелец.
Если же форма открывается другими способами, то эти колонки могут
понадобиться, поэтому просто удалить их из формы было бы
неправильно.
Поскольку форма создается на сервере, делать это нужно в обработчике события формы ПриСозданииНаСервере.
В режиме «Конфигуратор»
Вернемся в конфигуратор и устраним недостатки формы списка.
Для создания формы откроем окно редактирования объекта конфигурации Справочник ВариантыНоменклатуры, перейдем на закладку
Формы, нажмем кнопку открытия и создадим основную форму
списка (рис. 15.14).
Рис. 15.14. Создание основной формы списка
Если Параметры.Отбор.Свойство("Владелец") Тогда
Элементы.Код.Видимость = Ложь;
КонецЕсли;
В открывшемся окне конструктора нажмем Готово.
Форма, созданная конструктором, в отличие от автогенерируемой
формы, не содержит поля Владелец. Поэтому наша задача даже упрощается: нам нужно будет скрыть только одно поле – Код.
В открывшемся окне редактора форм вверху слева расположено окно
элементов формы. Выделим в нем элемент Форма (поскольку нам
нужно событие формы в целом) и двойным щелчком мыши откроем
палитру свойств этого элемента.
Прокрутив вниз список свойств формы, найдем событие ПриСозданииНаСервере и нажмем кнопку открытия (рис. 15.15).
Рис. 15.15. Создание обработчика события формы
«При создании на сервере»
В модуле формы будет создан обработчик события формы ПриСозданииНаСервере, в который мы внесем следующий текст (листинг 15.1).
Листинг 15.1. Обработчик события формы «ПриСозданииНаСервере()»
Прокомментируем этот код.
Параметры – это свойство управляемой формы, в модуле которой мы
находимся. Используя это свойство, мы получаем объект, который
содержит коллекцию параметров формы.
К элементу этой коллекции Отбор мы обращаемся по имени.
Используя метод Свойство() структуры элементов отбора, мы определяем, установлен ли отбор по полю Владелец.
Если такой отбор установлен, то мы устанавливаем видимость поля
Код в значение Ложь, то есть скрываем это поле. Здесь Элементы – это
свойство управляемой формы, которое позволяет получить доступ ко
всем элементам формы.
В режиме «1С:Предприятие»
Проверим результат изменений в режиме 1С:Предприятие.
Форма списка вариантов номенклатуры будет иметь следующий вид
(рис. 15.16).
Рис. 15.16. Список вариантов номенклатуры
Мы видим, что добились желаемого результата (см. рис. 15.13): было
три колонки, а теперь только одна – Наименование.
Теперь нажмем кнопку Создать, чтобы создать новый набор свойств
для элемента номенклатуры.
Откроется форма элемента справочника ВариантыНоменклатуры (рис.
15.17).
Рис. 15.17. Форма элемента справочника «Варианты номенклатуры»
Эта форма сгенерирована системой автоматически. Но в ней также
есть недостатки:
 заголовок формы должен быть задан в единственном числе;
 лишние поля Код и Владелец;
 команду перехода к подчиненной информации нужно переименовать в более понятную.
Вернемся в конфигуратор и исправим их.
В режиме «Конфигуратор»
Во-первых, нужно переименовать заголовок формы, чтобы было
понятно, что мы создаем в данный момент один вариант номенклатуры.
Для этого в окне редактирования объекта конфигурации Справочник
ВариантыНоменклатуры на закладке Основные зададим Представление объекта в единственном числе как Вариант номенклатуры (рис.
15.18).
Это свойство будет использоваться в интерфейсе «1С:Предприятия»
как заголовок формы элемента справочника.
Во-вторых, нужно убрать поля Код и Владелец из этой формы.
Для этого в окне редактирования объекта конфигурации Справочник
ВариантыНоменклатуры перейдем на закладку Формы, нажмем кнопку
открытия и создадим основную форму элемента.
В окне структуры элементов формы выделим поочередно эти
элементы и, нажимая кнопку Удалить в командной панели, удалим их
из формы (рис. 15.19).
Рис. 15.18. Установка представления объекта
Рис. 15.19. Удаление элементов формы
В результате в форме элемента будет отображен только один
реквизит справочника – Наименование.
Его представление мы тоже немного поправим.
На закладке Данные в окне редактирования объекта конфигурации
Справочник ВариантыНоменклатуры нажмем кнопку Стандартные
реквизиты, в списке этих реквизитов дважды щелкнем на реквизите
Наименование и в открывшейся палитре свойств зададим Синоним
реквизита – Название.
В-третьих, не вяжутся друг с другом заголовок формы Вариант
номенклатуры и подчиненная ему информация – Значения свойств
номенклатуры (см. рис. 15.17). Это записи одноименного регистра, к
которым можно перейти из формы элемента.
Поэтому в окне редактирования объекта конфигурации Регистр
сведений ЗначенияСвойствНоменклатуры на закладке Основные
зададим Представление списка как Состав варианта номенклатуры
(рис. 15.20).
Рис. 15.20. Установка представления списка регистра
Это свойство будет использоваться в интерфейсе «1С:Предприятия»
как заголовок формы списка регистра.
В режиме «1С:Предприятие»
Проверим результат изменений в режиме 1С:Предприятие.
Итак, в разделе Учет материалов откроем справочник Номенклатура и
его элемент Кабель электрический из группы Материалы > Прочее.
В форме элемента выполним команду Варианты номенклатуры для
перехода к списку наборов свойств данного элемента номенклатуры.
Пока этот список пуст.
Нажмем кнопку Создать. Теперь в открывшейся форме варианта
номенклатуры нас все устраивает.
Регистр сведений «Значения свойств
номенклатуры»
В режиме «1С:Предприятие»
Создадим вариант номенклатуры Белые кабели (рис. 15.21).
Рис. 15.21. Форма элемента справочника «Вариант номенклатуры»
Выполним команду Состав варианта номенклатуры для перехода к
составу редактируемого варианта номенклатуры.
ПОДСКАЗКА
Как показывает опыт многих читателей, при выполнении данного
занятия может возникнуть проблема – в панели навигации формы
варианта номенклатуры не видна команда для перехода к связанным
записям регистра сведений ЗначенияСвойствНоменклатуры (Состав
варианта номенклатуры). В этом случае, скорее всего, вы забыли установить свойство Ведущее для измерения этого регистра НаборСвойств,
имеющего тип СправочникСсылка.ВариантыНоменклатуры.
В результате того, что измерение регистра является ведущим, в панели
навигации формы элемента справочника ВариантыНоменклатуры появляется ссылка, по которой возможен переход к записям регистра,
содержащим в измерении НаборСвойств ссылку на текущий вариант
номенклатуры.
Если новый вариант номенклатуры еще не записан, то появится вопрос
о записи данных, на который мы ответим утвердительно (рис. 15.22).
После этого откроется форма списка регистра Значения свойств
номенклатуры, которая также генерируется по умолчанию
(рис. 15.23).
Рис. 15.22. Подтверждение записи данных
Рис. 15.23. Форма списка регистра «Состав варианта номенклатуры»
В этой форме нас также не все устраивает:
 заголовок колонки ВидСвойства лучше
переименовать,  лишняя колонка НаборСвойств.
Вернемся в конфигуратор и устраним недостатки формы списка.
В режиме «Конфигуратор»
Во-первых, название колонки Вид свойства лучше переименовать в
Свойство.
Для этого в окне редактирования объекта конфигурации Регистр
сведений ЗначенияСвойствНоменклатуры на закладке Данные
откроем палитру свойств измерения ВидСвойства и зададим его
Синоним как Свойство (рис. 15.24).
Во-вторых, поскольку регистр имеет ведущее измерение
НаборСвойств типа СправочникСсылка.ВариантыНоменклатуры, поле
Набор свойств – лишнее, так как владелец данного набора свойств
отражен в заголовке формы.
Рис. 15.24. Установка синонима для измерения регистра
Поэтому создадим обработчик события ПриСозданииНаСервере формы
списка регистра и в нем сделаем колонку НаборСвойств невидимой в
случае открытия формы с отбором по этому полю, то есть если форма
списка регистра открыта из формы элемента спра-вочника Варианты
номенклатуры.
Для создания этого обработчика откроем окно редактирования
объекта конфигурации Регистр сведений ЗначенияСвойствНоменклатуры, перейдем на закладку Формы, нажмем кнопку открытия
и создадим основную форму списка.
Затем создадим для формы обработчик события формы ПриСозданииНаСервере, в который мы внесем следующий текст (листинг 15.2).
Если Параметры.Отбор.Свойство("НаборСвойств") Тогда
Элементы.НаборСвойств.Видимость = Ложь;
КонецЕсли;
Листинг 15.2. Обработчик события формы «ПриСозданииНаСервере()»
Этот код аналогичен коду, приведенному выше в листинге 15.1,
поэтому в комментариях не нуждается.
В режиме «1С:Предприятие»
Проверим результат изменений в режиме 1С:Предприятие.
В результате форма списка регистра Состав варианта номенклатуры
примет вид (рис. 15.25).
Рис. 15.25. Форма списка регистра «Состав варианта номенклатуры»
Теперь, если нажать кнопку Создать, чтобы ввести новую запись в
состав варианта номенклатуры, откроется форма записи регистра
ЗначенияСвойствНоменклатуры (рис. 15.26).
Рис. 15.26. Форма записи регистра «Значения свойств номенклатуры»
Эта форма сгенерирована системой автоматически. Но в ней также
есть недостатки:
 заголовок формы должен быть задан в единственном числе,
 лишняя колонка НаборСвойств.
Вернемся в конфигуратор и исправим их.
В режиме «Конфигуратор»
Во-первых, нужно переименовать заголовок формы, чтобы было
понятно, что мы создаем в данный момент одно свойство и его
значение в составе варианта номенклатуры.
Для этого в окне редактирования объекта конфигурации Регистр
сведений ЗначенияСвойствНоменклатуры на закладке Основные
зададим Представление записи как Свойство и значение (рис. 15.27).
Рис. 15.27. Установка представления записи регистра
Это свойство будет использоваться в интерфейсе «1С:Предприятия»
как заголовок формы записи регистра.
Во-вторых, нужно убрать поле НаборСвойств из этой формы. Для
этого в окне редактирования объекта конфигурации Регистр сведений
ЗначенияСвойствНоменклатуры перейдем на закладку
Формы, нажмем кнопку открытия и создадим основную форму
записи.
В окне структуры элементов формы выделим этот элемент и, нажав
кнопку Удалить в командной панели, удалим его из формы.
В режиме «1С:Предприятие»
Проверим результат изменений в режиме 1С:Предприятие. В результате форма записи регистра ЗначенияСвойствНоменклатуры примет
вид (рис. 15.28).
Рис. 15.28. Форма записи регистра «Значения свойств номенклатуры»
Создание видов характеристик
номенклатуры
В режиме «1С:Предприятие»
Теперь создадим различные варианты номенклатуры в режиме
1С:Предприятие.
Итак, в разделе Учет материалов откроем справочник Номенклатура и
его элемент Кабель электрический из группы Материалы > Прочее.
В форме элемента номенклатуры выполним команду Варианты номенклатуры для перехода к списку наборов свойств данного элемента
номенклатуры.
В форме списка вариантов номенклатуры откроем набор свойств
Белые кабели, который мы создали ранее.
В форме варианта номенклатуры выполним команду Состав варианта
номенклатуры для перехода к составу редактируемого варианта
номенклатуры. Этот список пока пуст.
Нажмем кнопку Создать. В открывшейся форме (см. рис. 15.28)
создадим свойство Цвет со значением Белый. Для этого нажмем
кнопку выбора в поле Свойство и в выпадающем списке нажмем на
ссылку Показать все.
Измерение ВидСвойства(Свойство) регистра ЗначенияСвойствНоменклатуры имеет тип ПланВидовХарактеристикСсылка.СвойстваНоменклатуры. Поэтому перед нами появится форма выбора этого плана
видов характеристик. Список видов характеристик пока пуст.
Нажмем кнопку Создать. В открывшемся окне формы элемента плана
видов характеристик введем наименование вида характери-стики –
Цвет. Тип значения этого вида характеристики оставим по умолчанию
– Дополнительные свойства номенклатуры (рис. 15.29).
Рис. 15.29. Создание вида характеристики в плане видов характеристик
Обратите внимание, что в форме элемента плана видов характеристик
(см. рис. 15.29) и в форме элемента справочника дополнительных
характеристик номенклатуры (см. рис. 15.30) также есть лишнее поле
Код. Кроме того, заголовок этих форм желательно задать в единственном числе.
Мы не стали дорабатывать эти формы, так как уже показывали
подобные действия ранее. Вы можете сделать это самостоятельно
аналогично тому, как это показано для формы элемента справочника
ВариантыНоменклатуры.
Нажмем Записать и закрыть. В окне выбора плана видов характеристик появится созданный нами вид характеристики.
Нажмем кнопку Выбрать. В результате мы вернемся в форму записи
состава варианта номенклатуры с заголовком Свойство и значение.
Нажмем кнопку выбора в поле Значение и в выпадающем списке
нажмем кнопку Создать (+).
Ресурс Значение регистра ЗначенияСвойствНоменклатуры имеет тип
Характеристика.СвойстваНоменклатуры. Это составной тип данных,
который описан в свойстве Тип значения характеристик плана видов
характеристик СвойстваНоменклатуры.
Так как для вида характеристики Цвет мы задали тип значения СправочникСсылка.ДополнительныеСвойстваНоменклатуры, то перед нами
появится форма ввода нового элемента этого справочника.
В открывшемся окне формы элемента дополнительных свойств
номенклатуры введем тип значения Белый, в поле Владелец оставим
имеющееся значение – Цвет (рис. 15.30).
Нажмем Записать и закрыть.
Мы вернемся в форму записи состава варианта номенклатуры с заголовком Свойство и значение и увидим там созданное нами свойство
Цвет со значением Белый (рис. 15.31).
Рис. 15.30. Создание дополнительных свойств номенклатуры
Рис. 15.31. Свойство и значение в составе варианта номенклатуры
Нажмем Записать и закрыть. Мы вернемся в форму списка состава
варианта номенклатуры.
Создадим еще одно свойство – Сечение, мм2 – в составе варианта
номенклатуры Белые кабели. Для этого повторим только что выполненные действия.
Нажмем кнопку Создать (рис. 15.32).
В открывшейся форме записи состава варианта номенклатуры нажмем
кнопку выбора в поле Свойство и в выпадающем списке
нажмем на ссылку Показать все.
Рис. 15.32. Создание нового свойства в составе варианта номенклатуры
В форме выбора плана видов характеристик нажмем кнопку Создать.
В открывшемся окне формы элемента плана видов характеристик
введем наименование вида характеристики – Сечение, мм2 и выберем
Тип значения этого вида характеристики – Число, длина 15, точность 3
(рис. 15.33).
Рис. 15.33. Создание вида характеристики в плане видов характеристик
Нажмем Записать и закрыть. В окне выбора плана видов характеристик появится созданный нами вид характеристики.
Нажмем кнопку Выбрать. Мы вернемся в форму записи состава
варианта номенклатуры с заголовком Свойство и значение.
Введем число 2,5 в поле Значение (рис. 15.34).
Нажмем Записать и закрыть. Мы вернемся в форму списка состава
варианта номенклатуры.
Итак, мы видим два свойства и их значения, которые мы создали для
варианта номенклатуры Белые кабели (рис. 15.35).
Рис. 15.34. Свойство и значение в составе варианта номенклатуры
Рис. 15.35. Свойства и значения в составе варианта номенклатуры
Теперь аналогичным образом создадим набор свойств для элемента
справочника Номенклатура – Шланг резиновый.
Этот набор свойств будет называться Польша (рис. 15.36) и состоять
из следующих свойств (рис. 15.37):
 Цвет – Черный;
 Производитель – Fagumit.
Рис. 15.36. Вариант номенклатуры
для элемента номенклатуры «Шланг резиновый»
При создании свойства Цвет выберем его из уже имеющихся свойств
в плане видов характеристик.
Значение этого вида характеристики – Черный, сначала добавим в
справочник дополнительных свойств номенклатуры и затем выберем
из него.
При создании свойства Производитель с типом значения Дополнительные свойства номенклатуры сначала добавим это свойство в
план видов характеристик (тип значения – Дополнительные свойства
номенклатуры), а затем выберем из него.
Значение этого вида характеристики – Fagumit, сначала добавим в
справочник дополнительных свойств номенклатуры и затем выберем
из него.
Рис. 15.37. Свойства и значения
в составе варианта номенклатуры «Польша»
Теперь посмотрим на все, что мы создали, не с точки зрения пользователя, а с точки зрения разработчика.
Перейдем в главное меню программы. Для этого нажмем кнопку с
пиктограммой , расположенную в правом верхнем углу окна
приложения. Выполним команду главного меню Функции для технического специалиста. Поочередно откроем все объекты конфигурации, в
которых хранится информация о созданных нами характеристиках
номенклатуры.
В справочнике Варианты номенклатуры хранятся созданные нами
наборы свойств номенклатуры. При этом каждый набор свойств
подчинен конкретному элементу номенклатуры.
В плане видов характеристик Свойства номенклатуры хранятся
созданные нами виды характеристик номенклатуры:
 Цвет, тип значения СправочникСсылка.ДополнительныеСвойстваНоменклатуры;
 Сечение, мм2, тип значения Число;
 Производитель, тип значения СправочникСсылка.ДополнительныеСвойстваНоменклатуры.
В справочнике Дополнительные свойства номенклатуры хранятся
значения этих видов характеристик (за исключением вида характеристики Сечение типа Число). А в регистре сведений ЗначенияСвойствНоменклатуры хранятся соответствия видов характеристик и их значений в разрезе наборов свойств.
Взаимодействие этих объектов конфигурации представлено
на следующей схеме (рис. 15.38).
Рис. 15.38. Объекты конфигурации, в которых хранится информация о
характеристиках номенклатуры
Доработка учетных механизмов
Итак, мы добавили возможность указывать произвольные характеристики для номенклатуры и создали несколько таких характеристик –
вариантов номенклатуры.
Но это лишь часть работы. Теперь хотелось бы иметь возмож-ность
еще и учитывать номенклатуру в разрезе этих характеристик. А
именно:
 приходовать товар, указывая
характеристики;  расходовать товар, указывая
характеристики;
 получать отчеты не просто по номенклатуре, а по номенклатуре с
определенными характеристиками.
Для этого потребуется доработать имеющиеся регистры и создать
новый отчет, который позволит получать данные в разрезе свойств
номенклатуры.
Регистр «Остатки материалов»
В режиме «Конфигуратор»
Для обеспечения учета материалов по значениям характеристик необходимо изменить структуру регистра накопления ОстаткиМатериалов,
чтобы хранить в нем данные еще и в разрезе наборов свойств номенклатуры.
Для этого откроем окно редактирования объекта конфигурации
Регистр накопления ОстаткиМатериалов и на закладке Данные добавим
в него новое измерение НаборСвойств с типом СправочникСсылка.ВариантыНоменклатуры (рис. 15.39).
Рис. 15.39. Новое измерение «НаборСвойств»
Документ «Приходная накладная»
В режиме «Конфигуратор»
Теперь нам нужно доработать документ ПриходнаяНакладная, чтобы
при приходовании материалов можно было указать набор свойств и
чтобы этот набор свойств записывался в регистры при проведении
документа.
Для этого откроем окно редактирования объекта конфигурации
Документ ПриходнаяНакладная и на закладке Данные добавим в
табличную часть документа новый реквизит НаборСвойств с типом
СправочникСсылка.ВариантыНоменклатуры (рис. 15.40).
Рис. 15.40. Новый реквизит «НаборСвойств»
У этого реквизита необходимо заполнить свойство Связи параметров
выбора, чтобы после выбора номенклатуры в этом свойстве выбирать
только среди тех наборов свойств, которые относятся к данной номенклатуре.
Найдем в палитре свойств свойство Связи параметров выбора и
нажмем кнопку выбора .
Перенесем из списка доступных реквизитов в список параметров
реквизит Материалы.Материал (рис. 15.41).
Тем самым мы задали, что при выборе в поле НаборСвойств будет
всегда открываться список элементов справочника Варианты номенклатуры, подчиненных материалу, выбранному в колонке Материал.
Рис. 15.41. Связи параметров выбора
После этого расположим этот реквизит в табличной части формы
документа.
Для этого перейдем на закладку Формы и двойным щелчком мыши на
строке ФормаДокумента в списке форм откроем форму документа.
Затем в правом верхнем окне редактора форм на закладке Реквизиты
раскроем реквизит формы Объект.
Мы видим, что он содержит все реквизиты документа ПриходнаяНакладная.
Найдем в табличной части реквизит НаборСвойств и с помощью мыши
перетащим его в окно элементов формы, расположенное слева в
верхней части редактора форм, в таблицу Материалы.
Новый элемент расположим в структуре элементов формы после поля
Материал (рис. 15.42).
Обратите внимание, что в открывшейся палитре свойств элемента
формы НаборСвойств в свойстве ПутьКДанным уже указан реквизит
табличной части НаборСвойств, так как мы перетаскивали реквизит в
форму с помощью мыши, и оно заполнилось автоматически.
Свойство ПутьКДанным устанавливает связь элемента формы с реквизитом формы, то есть с отображаемыми данными. Это свойство
обязательно должно быть заполнено, иначе элемент формы не будет
показан!
…
// регистр ОстаткиМатериалов Приход
…
Движение.Материал = ТекСтрокаМатериалы.Материал;
Движение.НаборСвойств = ТекСтрокаМатериалы.НаборСвойств;
Движение.Склад = Склад;
…
Рис. 15.42. Изменение формы документа «Приходная накладная»
ПРИМЕЧАНИЕ
При добавлении элемента формы с помощью кнопки Добавитьсвойство
ПутьКДанным, устанавливающее связь элемента с реквизитом формы,
необходимо заполнять вручную.
В заключение в окне редактирования объекта конфигурации Документ
ПриходнаяНакладная на закладке Прочее откроем модуль объекта.
Откроем процедуру обработчика события ОбработкаПроведения и
добавим к формируемым движениям присвоение значения измерению
НаборСвойств регистра ОстаткиМатериалов (листинг 15.3).
Листинг 15.3. Фрагмент процедуры «ОбработкаПроведения()»
…
// регистр ОстаткиМатериалов Расход
…
Движение.Материал = ВыборкаДетальныеЗаписи.Номенклатура;
Движение.НаборСвойств = ВыборкаДетальныеЗаписи.НаборСвойств;
Движение.Склад = Склад;
…
Документ «Оказание услуги»
В режиме «Конфигуратор»
Теперь аналогичным образом доработаем документ ОказаниеУслуги.
Для того чтобы при расходовании материалов пользователь мог
указывать набор свойств для каждого расходуемого материала,
откроем окно редактирования объекта конфигурации Документ
ОказаниеУслуги и на закладке Данные добавим в табличную часть
документа новый реквизит НаборСвойств с типом СправочникСсылка.ВариантыНоменклатуры.
У этого реквизита заполним свойство Связи параметров выбора.
Перенесем из списка доступных реквизитов в список параметров
реквизит ПереченьНоменклатуры.Номенклатура. Тем самым мы
задали, что при выборе в поле НаборСвойств будет всегда открываться список элементов справочника Варианты номенклатуры,
подчиненных материалу, выбранному в колонке Номенклатура.
После этого расположим этот реквизит в табличной части формы
документа. Откроем форму документа и с помощью мыши перетащим
его из окна реквизитов формы в окно элементов формы. Новый
элемент расположим в структуре элементов формы после поля
Номенклатура.
В заключение в окне редактирования объекта конфигурации Документ
ОказаниеУслуги на закладке Прочее откроем модуль объекта.
Откроем процедуру обработчика события ОбработкаПроведения и
добавим к формируемым движениям присвоение значения измерению
НаборСвойств регистра ОстаткиМатериалов (листинг 15.4).
Листинг 15.4. Фрагмент процедуры «ОбработкаПроведения()»
Поскольку на предыдущем занятии мы оптимизировали процедуру
проведения документа и получали все данные документа с помощью
запроса, то в текст запроса нужно также добавить строки для
получения нового реквизита документа (листинг 15.5).
Листинг 15.5. Фрагмент процедуры «ОбработкаПроведения()»
…
Запрос = Новый Запрос;
// Укажем, какой менеджер временных таблиц использует этот запрос
Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
Запрос.Текст =
"ВЫБРАТЬ
| ОказаниеУслугиПереченьНоменклатуры.Номенклатура КАК Номенклатура,
| ОказаниеУслугиПереченьНоменклатуры.Номенклатура.ВидНоменклатуры КАК
| ВидНоменклатуры,
| ОказаниеУслугиПереченьНоменклатуры.НаборСвойств КАК НаборСвойств,
| СУММА(ОказаниеУслугиПереченьНоменклатуры.Количество) КАК
| КоличествоВДокументе,
| СУММА(ОказаниеУслугиПереченьНоменклатуры.Сумма) КАК СуммаВДокументе
|ПОМЕСТИТЬ НоменклатураДокумента
|ИЗ
| Документ.ОказаниеУслуги.ПереченьНоменклатуры КАК
| ОказаниеУслугиПереченьНоменклатуры
|ГДЕ
| ОказаниеУслугиПереченьНоменклатуры.Ссылка = &Ссылка
|СГРУППИРОВАТЬ ПО
| ОказаниеУслугиПереченьНоменклатуры.Номенклатура,
| ОказаниеУслугиПереченьНоменклатуры.Номенклатура.ВидНоменклатуры,
| ОказаниеУслугиПереченьНоменклатуры.НаборСвойств";
...
Запрос2 = Новый Запрос;
Запрос2.МенеджерВременныхТаблиц = МенеджерВТ;
Запрос2.Текст = "ВЫБРАТЬ
| НоменклатураДокумента.Номенклатура КАК Номенклатура,
| НоменклатураДокумента.ВидНоменклатуры КАК ВидНоменклатуры,
| НоменклатураДокумента.НаборСвойств КАК НаборСвойств,
| НоменклатураДокумента.КоличествоВДокументе КАК КоличествоВДокументе,
| НоменклатураДокумента.СуммаВДокументе КАК СуммаВДокументе,
| ЕСТЬNULL(СтоимостьМатериаловОстатки.СтоимостьОстаток, 0) КАК Стоимость, |
ЕСТЬNULL(ОстаткиМатериаловОстатки.КоличествоОстаток, 0) КАК Количество |ИЗ
| НоменклатураДокумента КАК НоменклатураДокумента …
Кроме этого, понадобится изменить последний запрос, который при
оперативном проведении проверяет, не появились ли отрица-тельные
остатки. Теперь мы будем получать остатки не «вообще» для
номенклатуры из табличной части документа, а для номенклатуры
именно с тем набором свойств, который указан в строках документа
(листинг 15.6).
Листинг 15.6. Контроль отрицательных остатков
при оперативном проведении
…
Запрос3.Текст = "ВЫБРАТЬ
| ОстаткиМатериаловОстатки.Материал КАК Материал,
| ОстаткиМатериаловОстатки.НаборСвойств КАК НаборСвойств,
| ОстаткиМатериаловОстатки.КоличествоОстаток КАК КоличествоОстаток
|ИЗ
| РегистрНакопления.ОстаткиМатериалов.Остатки( , (Материал, НаборСвойств) В |
(ВЫБРАТЬ
| НоменклатураДокумента.Номенклатура,
| НоменклатураДокумента.НаборСвойств
| ИЗ
| НоменклатураДокумента) И Склад = &Склад) |
КАК ОстаткиМатериаловОстатки
|ГДЕ
| ОстаткиМатериаловОстатки.КоличествоОстаток < 0";
Запрос3.УстановитьПараметр("Склад", Склад);
РезультатЗапроса = Запрос3.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Сообщение = Новый СообщениеПользователю();
Сообщение.Текст = "Не хватает " + Строка(
- ВыборкаДетальныеЗаписи.КоличествоОстаток) +
" единиц материала """ + ВыборкаДетальныеЗаписи.Материал + """" + "
из набора свойств """ + ВыборкаДетальныеЗаписи
.НаборСвойств + """";
Сообщение.Сообщить();
Отказ = Истина;
КонецЦикла;
…
Приход/расход номенклатуры с
учетом характеристик
В режиме «1С:Предприятие»
Теперь запустим «1С:Предприятие» в режиме отладки и укажем
наборы свойств при приходовании материалов.
Откроем документ Приходная накладная № 2 и укажем, что был
закуплен белый электрический кабель в количестве 2 шт. и польский
резиновый шланг (количество без изменения – 5 шт.).
Затем скопируем первую строку документа и укажем, что был
закуплен еще и черный электрический кабель в количестве 3 шт. (в
процессе ввода нам придется создать еще один набор свойств для
электрического кабеля – Черные кабели, у которого Цвет – Черный и
Сечение – 2,5), рис. 15.43.
Рис. 15.43. Документ «Приходная накладная № 2»
Нажмем Провести и, выполнив команду Остатки материалов в панели
навигации формы документа, проверим движения документа по
регистру ОстаткиМатериалов (рис. 15.44).
Рис. 15.44. Движения документа «Приходная накладная № 2»
по регистру «Остатки материалов»
Теперь откроем документ Оказание услуги № 1 и укажем, что был
израсходован польский резиновый шланг (рис. 15.45).
Рис. 15.45. Документ «Оказание услуги № 1»
Нажмем Провести и, выполнив команду Остатки материалов в панели
навигации формы документа, проверим движения документа по
регистру ОстаткиМатериалов (рис. 15.46).
Рис. 15.46. Движения документа «Оказание услуги № 1»
по регистру «Остатки материалов»
Отчет, использующий характеристики
Для полного завершения картины мы создадим отчет, который будет
показывать нам наличие материалов с теми или иными свойствами.
При создании этого отчета мы используем те возможности, которые
предоставляет нам система компоновки данных для работы с характеристиками (рис. 15.47).
Коротко говоря, набором данных для системы компоновки данных
будет довольно простой запрос к регистру ОстаткиМатериалов. А
свойства вариантов номенклатуры платформа задействует
в этом отчете автоматически на основании того описания, которое мы
создали у справочника ВариантыНоменклатуры (см. раздел «Описание
характеристик вариантов номенклатуры»).
Рис. 15.47. Результат отчета
Система компоновки данных сама сформирует достаточно понятный
и удобный интерфейс для работы с характеристиками и в зависи-мости
от значений, выбранных пользователем, будет формировать
необходимые запросы к базе данных.
В режиме «Конфигуратор»
Добавим новый объект конфигурации Отчет. Назовем его ОстаткиМатериаловПоСвойствам и запустим конструктор схемы компоновки данных. Добавим новый Набор данных – запрос и вызовем
конструктор запроса.
Запрос для набора данных
В качестве источника данных для запроса выберем виртуальную
таблицу регистра накопления ОстаткиМатериалов.ОстаткиИОбороты.
Из этой таблицы выберем следующие поля (рис. 15.48):
 Материал,
 НаборСвойств,
 КоличествоНачальныйОстаток,
 КоличествоПриход,
 КоличествоРасход,
 КоличествоКонечныйОстаток.
После этого на закладке Объединения/Псевдонимы зададим псевдонимы числовых полей без слова Количество (рис. 15.49).
Рис. 15.48. Выбранные поля
Рис. 15.49. Объединения/Псевдонимы
На этом создание запроса закончено. Нажмем ОK.
Ресурсы
Приступим к редактированию схемы компоновки данных.
Прежде всего, на закладке Ресурсы выберем все доступные ресурсы
(рис. 15.50).
Рис. 15.50. Описание ресурсов
Настройки
Перейдем на закладку Настройки. Создадим структуру отчета –
добавим группировку Детальные записи.
Затем на закладке Выбранные поля выберем те поля, которые будут
выводиться в отчет: Материал, НаборСвойств, НачальныйОстаток,
Приход, Расход и КонечныйОстаток (рис. 15.51).
Рис. 15.51. Группировки и поля отчета
Затем перейдем на закладку Другие настройки и зададим заголовок
отчета – Остатки материалов по свойствам.
Чтобы иметь возможность протестировать наш отчет, включим
настройку Отбор в состав быстрых пользовательских настроек.
Для этого нажмем кнопку Свойства элемента пользовательских
настроек, расположенную вверху в командной панели окна настроек.
В появившемся окне мы можем редактировать состав пользовательских настроек отчета. Установим признак использования для
настройки Отбор и оставим предложенное для нее по умолчанию
свойство Режим редактирования в значении Быстрый (рис. 15.52).
Рис. 15.52. Состав пользовательских настроек
В заключение определим, в каких подсистемах будет отображаться
наш отчет.
Закроем конструктор схемы компоновки данных и в окне редактирования объекта конфигурации Отчет ОстаткиМатериаловПоСвойствам
перейдем на закладку Подсистемы.
Отметим в списке подсистем конфигурации подсистемы УчетМатериалов и Бухгалтерия.
На этом создание отчета завершено.
В режиме «1С:Предприятие»
Запустим «1С:Предприятие» в режиме отладки и посмотрим, какие
результаты можно получить с помощью нашего отчета.
В разделе Учет материалов выполним команду открытия отчета
Остатки материалов по свойствам (рис. 15.53).
Мы видим настройку Отбор, расположенную в отчетной форме, с
помощью которой мы можем получать остатки материалов в разрезе
их характеристик.
Рис. 15.53. Форма отчета
Сначала посмотрим, какие у нас есть материалы с сечением 2,5 мм².
Для этого в поле настройки Отбор нажмем кнопку выбора (см. рис.
15.53). В появившемся окне Редактирование отбора слева мы видим
список доступных полей отчета.
Раскроем поле Набор свойств (рис. 15.54).
Обратите внимание, что к стандартным реквизитам справочника
ВариантыНоменклатуры система компоновки данных добавила все
характеристики, которые определены нами для различных наборов
свойств в базе данных: Производитель, Сечение и Цвет. Таким
образом, отбор в отчете по значениям каких-либо характеристик
является достаточно простым и интуитивно понятным.
Чтобы узнать, какие у нас есть материалы с сечением 2,5 мм², достаточно выбрать поле Сечение, мм2 и задать для него условие равенства
2,5.
Рис. 15.54. Создание отбора
Нажмем ОК. В окне отчета нажмем Сформировать и получим
следующий результат (рис. 15.55).
Рис. 15.55. Результат отчета
Затем посмотрим, какие у нас есть материалы черного цвета. Для этого
в поле настройки Отбор еще раз нажмем кнопку выбора и
удалим прежний отбор кнопкой Удалить над списком условий отбора.
Затем двойным щелчком мыши выберем из списка доступных полей
поле Цвет. Затем в поле Значение нажмем кнопку выбора и выберем
из списка дополнительных свойств номенклатуры значение Черный
(рис. 15.56).
Рис. 15.56. Создание отбора
Нажмем ОК. В окне отчета нажмем Сформировать и получим
следующий результат (рис. 15.57).
Рис. 15.57. Результат отчета
И в заключение, чтобы убедиться в правильности работы отчета,
посмотрим, сколько у нас резиновых шлангов черного цвета.
В поле настройки Отбор еще раз нажмем кнопку выбора и добавим
еще один элемент отбора. Для этого двойным щелчком мыши выберем
из списка доступных полей поле Материал.
Затем в поле Значение нажмем кнопку выбора и выберем из списка
номенклатуры значение Шланг резиновый (рис. 15.58).
Рис. 15.58. Создание отбора
Нажмем ОК.
В окне отчета нажмем Сформировать и получим следующий
результат (рис. 15.59).
Рис. 15.59. Результат отчета
Таким образом, мы убедились в том, что при использовании данной
логической схемы мы имеем теперь возможность вести учет материалов в произвольном количестве разрезов свойств и их значений.
Следует заметить, что пример, рассмотренный нами в этой главе, не
является законченным решением для данной конфигурации. Мы лишь
продемонстрировали возможность ведения такого учета. Для того
чтобы наша конфигурация могла полноценно использо-вать свойства
материалов, необходимо внести соответствующие изменения в
остальные регистры, документы и некоторые отчеты.ЗАНЯТИЕ 15
Бухгалтерский учет
На этом занятии мы проиллюстрируем возможность ведения бухгалтерского учета средствами «1С:Предприятия». В рамках этого занятия
мы не будем объяснять и рассматривать основы бухгалтерского учета.
Поэтому если у вас нет знаний бухгалтерии, то, конечно, лучше
сначала прочитать какую-нибудь популярную литературу о том, как
вообще устроен бухгалтерский учет в нашей стране.
Для организации бухгалтерского учета мы используем уже знакомый
нам объект конфигурации – план видов характеристик и два новых
объекта – План счетов и Регистр бухгалтерии.
Регистр бухгалтерии будет использоваться нами для накопления
данных о совершенных хозяйственных операциях.
С помощью плана счетов мы будем описывать счета, в разрезе которых
ведется учет, а план видов характеристик будет служить для описания
объектов аналитического учета, в разрезе которых должен вестись
учет на счетах.
Сразу оговоримся, что план счетов, который мы будем использовать в
нашей учебной конфигурации, очень сильно упрощен. Он содержит
всего несколько условных счетов, которые, однако, позволят нам
познакомиться с основными методами организации бухгалтерского
учета средствами «1С:Предприятия».
План видов характеристик в
бухгалтерском учете
Объект конфигурации План видов характеристик был подробно
рассмотрен нами на предыдущем занятии (см. «Что такое план видов
характеристик»), поэтому сейчас мы проиллюстрируем только
использование этого объекта в контексте бухгалтерского учета.
Бухгалтерский учет, как правило, подразумевает ведение аналитического учета на большинстве счетов. Для обозначения разрезов
аналитического учета мы будем использовать термин виды субконто.
То есть на каждом счете учет может вестись в разрезе нескольких
видов субконто.
А для обозначения конкретных объектов аналитического учета мы
будем использовать термин субконто.
Например, на 41 счете (Товары) учет ведется обычно в разрезе
Номенклатуры и Складов, которые являются видами субконто. А вот
конкретная номенклатура Паста шоколадная и конкретный склад
Основной, указанные для некоторой проводки по 41 счету, – это
субконто.
Так вот, частным случаем использования плана видов характе-ристик
является применение его для описания видов субконто. То есть все
разрезы аналитического учета описываются в соответству-ющем
плане видов характеристик, и там же задаются типы значений, которые
могут принимать те или иные субконто.
Добавление плана видов характеристик В
режиме «Конфигуратор»
Приступим к созданию плана видов характеристик, который будет
содержать описания разрезов аналитического учета – видов субконто.
Откроем конфигуратор и добавим новый объект конфигурации План
видов характеристик. Зададим его имя – ВидыСубконто. На закладке
Подсистемы укажем, что план счетов будет отображаться в подсистеме Бухгалтерия.
Поскольку нам понадобится некий вспомогательный справочник, в
котором пользователи будут осуществлять «свободное творчество» по
созданию значений новых объектов аналитического учета, добавим
объект конфигурации Справочник и назовем его Субконто.
Затем на закладке Владельцы укажем, что этот справочник будет
подчинен плану видов характеристик ВидыСубконто.
Для этого на закладке Владельцы нажмем кнопку Редактировать
элемент списка и выберем в качестве владельца справочника план
видов характеристик ВидыСубконто (рис. 16.1).
Закроем окно редактирования справочника и вернемся к нашему
плану видов характеристик.
На закладке Основные установим свойство Тип значения характеристик. Нажмем кнопку выбора и зададим составной тип данных
следующим образом (рис. 16.2):
 СправочникСсылка.Клиенты,
 СправочникСсылка.Номенклатура,
 СправочникСсылка.Субконто.
Рис. 16.1. Окно редактирования справочника «Субконто»
Рис. 16.2. Выбор типа значения характеристик плана вида характеристик
Бухгалтерия нашего ООО «На все руки мастер» ведет учет движения
денежных средств только в разрезе материалов и клиентов, но не
исключено, что в дальнейшем понадобится дополнительная аналитика
(поэтому мы и используем справочник Субконто).
Обратите внимание, что тот справочник, который будет использован в
качестве дополнительных значений характеристик, тоже должен
входить в составной тип данных типа значений характеристик, иначе
конфигуратор выдаст сообщение об ошибке.
Затем укажем, что дополнительные значения характеристик будут
находиться в справочнике Субконто.
После этого перейдем на закладку Прочее и, нажав кнопку Предопределенные, начнем ввод предопределенных значений плана видов
характеристик (рис. 16.3). То есть тех видов аналитического учета, в
разрезе которых мы будем вести учет.
Рис. 16.3. Предопределенные виды характеристик
Нажимая кнопку Добавить, создадим предопределенный вид субконто
Материалы с кодом 000000001 и типом СправочникСсылка.Номенклатура.
Затем создадим вид субконто Клиенты с кодом 000000002 и типом
СправочникСсылка.Клиенты.
На этом создание видов субконто завершено, и мы можем перейти к
знакомству со следующим объектом конфигурации, который будет
использован нами, – План счетов.
Что такое «План счетов»
Объект конфигурации План счетов предназначен для описания
структуры хранения информации о совокупности синтетических
счетов предприятия, которые созданы для группировки данных о его
хозяйственной деятельности.
На основе объекта конфигурации План счетов платформа создает в базе
данных таблицы, в которых будет храниться информация о том, какие
счета и каким образом будет использовать предприятие.
Это может быть система бухгалтерских счетов, установленная государством, план управленческих счетов или произвольный набор
счетов, используемых для анализа тех или иных видов деятельности
предприятия.
План счетов в системе «1С:Предприятие» поддерживает иерархию
субсчетов: к каждому счету первого уровня может быть открыто
несколько субсчетов, которые, в свою очередь, могут иметь свои
субсчета, и так далее.
Например, законодательно утвержденный план счетов для ведения
бухучета в России имеет следующий вид (рис. 16.4).
Рис. 16.4. Российский план счетов
По любому счету или субсчету может вестись аналитический учет в
разрезе субконто, описанных в плане видов характеристик. Связь
между планом счетов и планом видов характеристик задается разработчиком на этапе конфигурирования.
Для описания используемых субконто система создает в плане счетов
специальную табличную часть ВидыСубконто, которая не видна в
конфигураторе (но доступна средствами встроенного языка).
Для каждого счета есть возможность задать несколько видов учета
(например, количественный и валютный). Виды учета задаются при
помощи подчиненных объектов конфигурации признак учета.
Также существует возможность определить несколько видов учета
субконто (например, суммовой, валютный или количественный).
Виды учета субконто задаются при помощи подчиненных объектов
конфигурации признак учета субконто.
УЗНАЙ БОЛЬШЕ!
О структуре объектов встроенного языка, предназначенных для
работы с планами счетов, можно прочитать в разделе «Краткий
справочник разработчика. Планы счетов».
Помимо всего вышеперечисленного каждый счет может иметь набор
свойств, которые задаются в качестве реквизитов объекта конфигурации План счетов. Они позволяют определять уникальные свойства
элементов плана счетов (например, реквизит ЗапретитьИспользоватьВПроводках).
Добавление плана счетов В
режиме «Конфигуратор»
Приступим к созданию плана счетов ООО «На все руки мастер».
Как мы говорили в начале этого занятия, бухгалтерский учет в нашем
ООО «На все руки мастер» сильно упрощен. Поэтому план счетов, по
которому работает бухгалтерия, содержит всего четыре счета:
 Товары,
 РасчетыСПоставщиками,
 Капитал,
 Дебиторская задолженность.
Добавим новый объект конфигурации План счетов. Присвоим ему имя
– Основной. Свойство Представление списка зададим как Основной
план счетов. На закладке Подсистемы укажем, что план счетов будет
отображаться в подсистеме Бухгалтерия. На закладке Данные выделим
группу реквизитов Признаки учета и, нажав кнопку Добавить,
создадим признак учета Количественный (рис. 16.5).
Рис. 16.5. Создание реквизита плана счетов в группе «Признаки учета»
Перейдем на закладку Субконто и укажем, что виды субконто для этого
плана счетов будут находиться в плане видов характеристик
ВидыСубконто.
Максимальное количество субконто на счете установим равным двум.
Также создадим признак учета субконто Количественный (рис. 16.6).
Рис. 16.6. Установка свойств «Субконто для плана счетов»
Затем откроем закладку Прочее. Нажмем кнопку Предопределенные
и создадим четыре предопределенных счета (при создании каждого
счета, перед тем как нажать кнопку Добавить, нужно выделить корень
структуры счетов – строку Счета):
 Товары, код 41, активный, с количественным учетом в разрезе
материалов (рис. 16.7).
Рис. 16.7. Предопределенный счет «Товары»
 РасчетыСПоставщиками, код 60, активный/пассивный (рис. 16.8).
Рис. 16.8. Предопределенный счет «РасчетыСПоставщиками»
 ДебиторскаяЗадолженность, код 62, активный/пассивный, в разрезе клиентов (рис. 16.9).
Рис. 16.9. Предопределенный счет «ДебиторскаяЗадолженность»
 Капитал, код 90, активный/пассивный (рис. 16.10).
Рис. 16.10. Предопределенный счет «Капитал»
В результате план счетов нашего ООО «На все руки мастер» будет
выглядеть следующим образом (рис. 16.11).
Рис. 16.11. План счетов «Основной»
Теперь мы можем перейти к знакомству с последним объектом конфигурации, который понадобится нам для организации бухгалтерского
учета, – Регистром бухгалтерии.
УЗНАЙ БОЛЬШЕ!
Для плана счетов можно установить свойство «Автопорядок по
коду». Это свойство используется для того, чтобы указать системе,
что упорядочивание по полю «Порядок» должно всегда подставляться
в тех случаях, когда пользователь или разработчик выбирает упорядочивание по коду. Его нужно использовать прежде всего тогда, когда с
точки зрения пользователя нужно упорядочивать план счетов по коду
с учетом разделителей кода счета. Например, если счета 10.11 и 10.2
упорядочивать по коду счета, то счета будут располагаться так:
10.11
10.2
Это правильно с точки зрения сортировки строк, но не соответствует логическому смыслу кодов.
Но если заданы значения поля «Порядок» 10.11 и 10. 2 (перед 2 – пробел)
и установлено свойство «Автопорядок по коду», то при выборе упорядочивания по коду пользователь будет фактически получать порядок,
учитывающий разделители:
10.2
10.11
Если свойство не устанавливать, то нужно будет в явном виде
выбирать упорядочивание по полю «Порядок».
Что такое регистр бухгалтерии
Объект конфигурации Регистр бухгалтерии предназначен для
описания структуры накопления данных, учет которых ведется исходя
из некоторого плана счетов. На основе объекта конфигурации Регистр
бухгалтерии платформа создает в базе данных таблицу, в которой будут
накапливаться данные о хозяйственных операциях, отобража-емых в
бухгалтерском учете.
По своему виду регистр бухгалтерии напоминает регистр накопления
– он также имеет ресурсы, может иметь измерения и реквизиты.
Измерения позволяют разделять ведение учета (например, используя
измерение Организация, можно вести учет в разрезе нескольких
юридических лиц).
Реквизиты служат признаком, по которому одни записи регистра
можно отделить от других (например, в качестве реквизита может
использоваться номер журнала, что позволит отбирать проводки,
имеющие одинаковый смысл).
Значительное отличие от регистра накопления заключается в том, что
регистр бухгалтерии имеет жесткую связь с используемым планом
счетов. Поэтому каждая запись регистра бухгалтерии содержит
дополнительные поля, определяемые настройкой используемого
плана счетов.
Например, запись регистра может содержать дополнительные поля
для указания корреспондирующих счетов, сумм, объектов аналитического учета (субконто), количества, вида валюты и т.д.
Кроме этого, отличительной чертой регистра бухгалтерии является
возможность поддержки механизма двойной записи, при которой
каждая запись регистра содержит обязательные поля для указания
счета дебета и счета кредита.
УЗНАЙ БОЛЬШЕ!
О структуре объектов встроенного языка, предназначенных для
работы с регистрами бухгалтерии, можно прочитать в разделе
«Краткий справочник разработчика. Регистры бухгалтерии».
Добавление регистра бухгалтерии В
режиме «Конфигуратор»
Создадим новый объект конфигурации Регистр бухгалтерии. Зададим
его имя – Управленческий. Свойство Расширенное представление
списка зададим как Движения в регистре Управленческий. Укажем, что
с ним будет связан план счетов Основной. Установим флажок
Корреспонденция (рис. 16.12).
Рис. 16.12. Основные свойства регистра бухгалтерии
Флажок Корреспонденция будет говорить о том, что создаваемый нами
регистр поддерживает корреспонденцию. Это означает, что каждая
запись регистра имеет дебетовую и кредитовую часть, что позволит
нам получать информацию не только об остатках и оборотах по
счетам, но и о корреспонденциях между счетами.
Регистры, не поддерживающие корреспонденцию, применяются
тогда, когда не нужно использовать принцип двойной записи, регламентированный в бухгалтерском учете, и, соответственно, контролировать баланс хозяйственных средств и их источников.
На закладке Подсистемы укажем, что регистр будет отображаться в
подсистеме Бухгалтерия.
Теперь перейдем на закладку Данные и создадим два ресурса:
 Сумма, длина 15, точность 2, Балансовый;
 Количество, длина 15, точность 3, Небалансовый, признак учета –
Количественный, признак учета субконто – Количественный (рис.
16.13).
Рис. 16.13. Свойства ресурса «Количество» регистра бухгалтерии
В заключение сделаем видимой
регистра в разделе Бухгалтерия
созданных нами ранее регистров.
команду для открытия списка и
расположим ее после всех
Откроем командный интерфейс подсистемы Бухгалтерия из контекстного меню этой подсистемы, выделив ее в списке подсистем в дереве
объектов конфигурации. В группе Панель навигации.Обычное
включим видимость у команды Управленческий и мышью перетащим
ее в группу Панель навигации.См. также.
На этом создание нашего регистра бухгалтерии завершено.
Теперь настало время познакомиться с тем, каким образом используется созданный нами регистр бухгалтерии Управленческий.
Доработка приходной накладной
Что нас ждет дальше?
Сначала мы доработаем оба наши документа (ПриходнаяНакладная и
ОказаниеУслуги) так, чтобы они «поставляли» данные не только для
регистров накопления, но и для регистра бухгалтерии.
Затем мы создадим бухгалтерский отчет Оборотно-сальдовая
ведомость, который будет показывать нам состояние товародви-жения
в ООО «На все руки мастер», основываясь на данных регистра
бухгалтерии.
При проведении наши документы будут создавать следующие бухгалтерские проводки – записи в регистре бухгалтерии (таблица 16.1).
Таблица 16.1. Проводки, создаваемые документами
Документы Проводки
Дебет Кредит Сумма
Приходная на- 41
кладная
Оказание услуги 62
90
Товары 60
Дебиторская 90
задолженность
Капитал 41
Расчеты
с поставщиками
Капитал
Товары
Стоимость
Выручка
Стоимость
Эти проводки мы отразим при создании движений документов в
регистре бухгалтерии.
Итак, сначала изменим процедуру проведения документа ПриходнаяНакладная, а затем в режиме 1С:Предприятие перепроведем все
эти документы, чтобы отработал новый, измененный нами алгоритм
проведения документа ПриходнаяНакладная.
В режиме «Конфигуратор»
В окне редактирования объекта конфигурации Документ ПриходнаяНакладная перейдем на закладку Движения. В списке
регистров отметим, что документ будет создавать теперь движения и
по регистру бухгалтерии Управленческий. Перейдем на закладку
Прочее и откроем модуль объекта. Откроем процедуру обработчика
события ОбработкаПроведения. В самом конце цикла перед строкой
КонецЦикла добавим строки кода, создающие движения регистра
Управленческий (листинг 16.1).
Листинг 16.1. Движения документа «ПриходнаяНакладная» (фрагмент)
// Регистр Управленческий
Движение = Движения.Управленческий.Добавить();
Движение.СчетДт = ПланыСчетов.Основной.Товары;
Движение.СчетКт = ПланыСчетов.Основной.РасчетыСПоставщиками;
Движение.Период = Дата;
Движение.Сумма = ТекСтрокаМатериалы.Сумма;
Движение.КоличествоДт = ТекСтрокаМатериалы.Количество;
Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Материалы] =
ТекСтрокаМатериалы.Материал;
Перед началом цикла установим свойство Записывать набора записей
регистра Управленческий в значение Истина для записи изменений
регистра в базу данных.
В результате процедура ОбработкаПроведения будет выглядеть
следующим образом (листинг 16.2).
Листинг 16.2. Движения документа «ПриходнаяНакладная»
Процедура ОбработкаПроведения(Отказ, Режим)
Движения.ОстаткиМатериалов.Записывать = Истина;
Движения.СтоимостьМатериалов.Записывать = Истина;
Движения.Управленческий.Записывать = Истина;
Для Каждого ТекСтрокаМатериалы Из Материалы Цикл
// Регистр ОстаткиМатериалов Приход
Движение = Движения.ОстаткиМатериалов.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.Материал = ТекСтрокаМатериалы.Материал;
Движение.НаборСвойств = ТекСтрокаМатериалы.НаборСвойств;
Движение.Склад = Склад;
Движение.Количество = ТекСтрокаМатериалы.Количество;
// Регистр Стоимость Материалов Приход
Движение = Движения.СтоимостьМатериалов.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.Материал = ТекСтрокаМатериалы.Материал;
Движение.Стоимость = ТекСтрокаМатериалы.Сумма;
// Регистр Управленческий
Движение = Движения.Управленческий.Добавить();
Движение.СчетДт = ПланыСчетов.Основной.Товары;
Движение.СчетКт = ПланыСчетов.Основной.РасчетыСПоставщиками;
Движение.Период = Дата;
Движение.Сумма = ТекСтрокаМатериалы.Сумма;
Движение.КоличествоДт = ТекСтрокаМатериалы.Количество;
Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Материалы]
= ТекСтрокаМатериалы.Материал;
КонецЦикла;
КонецПроцедуры
Прокомментируем этот код.
Как видите, движения для регистра бухгалтерии формируются таким
же образом, как и для регистра накопления.
Но платформа (при создании таблицы хранения данных) добавила к
созданным нами реквизитам регистра еще ряд полей, которые явились
следствием использования плана счетов Основной.
Прежде всего, это поля СчетДт и СчетКт. В этих полях указываются
счета, дебет и кредит которых затрагивает данная проводка.
Кроме этого, для измерений и ресурсов регистра, связанных с
признаками учета, платформа создает пару полей для хранения
значения каждого ресурса отдельно по дебету и отдельно по кредиту
проводки – КоличествоДт и КоличествоКт. А также для счетов, по
которым ведется учет в разрезе субконто, платформа создает
коллекции СубконтоДт и СубконтоКт.
Если обратиться к таблице 16.1, то при проведении приходной
накладной счетом по дебету должен быть счет Товары (41), а счетом
по кредиту – счет РасчетыСПоставщиками (60).
К счету мы обращаемся с помощью свойства глобального контекста
ПланыСчетов. Оно предоставляет доступ ко всем планам счетов,
созданным в конфигурации. Через точку от него мы указываем имя
нужного нам плана счетов – Основной. А далее, тоже через точку,
указываем имя предопределенного счета в этом плане счетов –
Товары. Этот счет (и три других) мы создали в конфигураторе.
Так как количественный учет у нас ведется только для счета Товары
(41), то поле регистра КоличествоДт заполняется количеством товара
из табличной части документа. Поле регистра КоличествоКт не заполняется, так как по счету кредита проводки (РасчетыСПоставщиками)
количественный учет не ведется.
Теперь рассмотрим последнюю строку цикла, в которой присваивается значение субконто дебета.
Дело в том, что количество субконто на счете дебета и на счете кредита
в каждой проводке будет различное, в зависимости от того, как
определены счета в используемом плане счетов. Поэтому для каждой
записи движения регистра бухгалтерии платформа хранит две
коллекции значений: коллекцию субконто дебета и коллекцию
субконто кредита. Каждая из них содержит ровно столько элементов,
сколько видов субконто указано использовать для соответствующего
счета (дебета или кредита) в плане счетов.
Обратиться к элементу коллекции можно, указав в квадратных
скобках ссылку на соответствующий вид субконто (ПланыВидовХарактеристик.ВидыСубконто.Материалы).
Другой способ – в явном виде указать имя предопределенного вида
субконто через точку от коллекции субконто дебета.
Другими словами, запись Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Материалы] равносильна записи Движение.СубконтоДт.Материалы.
Коллекция регистра СубконтоКт не заполняется, так как по счету
кредита проводки (РасчетыСПоставщиками) учет в разрезе субконто у
нас не ведется.
В заключение отредактируем командный интерфейс формы
документа, чтобы в панели навигации формы иметь возможность
переходить к списку записей регистра Управленческий, связанному с
документом.
Для этого откроем форму документа ПриходнаяНакладная. В левом
верхнем окне перейдем на закладку Командный интерфейс. В разделе
Панель навигации раскроем группу Перейти и установим видимость
для команды открытия регистра бухгалтерии Управленческий.
В режиме «1С:Предприятие»
Запустим «1С:Предприятие» в режиме отладки.
Платформа предупредит нас, что регистр бухгалтерии Управленческий и справочник Субконто не включены ни в одну подсистему.
Проигнорируем это сообщение.
Откроем документ Приходная накладная № 1 и нажмем Провести.
Выполним команду перехода к регистру Управленческий
и посмотрим, какие движения сформировал документ в регистре
бухгалтерии (рис. 16.14, 16.15).
Рис. 16.14. Движения документа «Приходная накладная № 1» в
регистре бухгалтерии «Управленческий»
Рис. 16.15. Движения документа «Приходная накладная № 1» в
регистре бухгалтерии «Управленческий»
Обратите внимание: поскольку на счете 60 (РасчетыСПоставщиками)
отсутствует аналитика и ведется только суммовой учет, в записях
движений регистра Субконто1Кт, Субконто2Кт и КоличествоКт не
указаны.
После этого перепроведем документ Приходная накладная № 2 и
убедимся, что он тоже формирует правильные проводки по регистру
бухгалтерии Управленческий.
Теперь перейдем к более сложной задаче: добавлению движений по
регистру Управленческий в документ ОказаниеУслуги.
Доработка документа «Оказание услуги»
Сначала мы изменим процедуру проведения документа ОказаниеУслуги, а затем в режиме 1С:Предприятие перепроведем все эти
документы, чтобы отработал новый, измененный нами алгоритм
проведения документов Оказание услуги.
В режиме «Конфигуратор»
В отличие от документа ПриходнаяНакладная, который создавал всего
одну бухгалтерскую проводку, документ ОказаниеУслуги будет
создавать уже две.
Напомним, что бухгалтерия нашего ООО «На все руки мастер» не
совсем похожа на настоящую, потому что для облегчения своей
работы она учитывает только движения материалов. Услуги, которые
оказывает организация, для нее как бы не существуют.
Поэтому документ ОказаниеУслуги будет формировать движения по
регистру бухгалтерии только в той части, которая касается расходования материалов.
В окне редактирования объекта конфигурации Документ ОказаниеУслуги перейдем на закладку Движения. В списке регистров отметим,
что документ будет создавать теперь движения и по регистру Управленческий. Перейдем на закладку Прочее и откроем модуль объекта.
Откроем процедуру обработчика события ОбработкаПроведения.
Поскольку нас интересует только движение материалов, для внесения
дополнений подойдет тело условия Если…, в котором мы формировали движения по регистрам ОстаткиМатериалов и СтоимостьМатериалов.
Добавим в конец условия, перед строкой КонецЕсли, движения по
регистру бухгалтерии Управленческий (листинг 16.3).
Листинг 16.3. Движения документа «ОказаниеУслуги» (фрагмент)
…
Если ВыборкаДетальныеЗаписи.ВидНоменклатуры =
Перечисления.ВидыНоменклатуры.Материал Тогда
// Регистр ОстаткиМатериалов Расход
…
// Регистр СтоимостьМатериалов Расход
…
// Регистр Управленческий
// Первая проводка: Д 62(ДебиторскаяЗадолженность) – К 90 (Капитал) Розничная сумма
Движение = Движения.Управленческий.Добавить();
Движение.СчетДт = ПланыСчетов.Основной.ДебиторскаяЗадолженность;
Движение.СчетКт = ПланыСчетов.Основной.Капитал;
Движение.Период = Дата;
Движение.Сумма = ВыборкаДетальныеЗаписи.СуммаВДокументе;
Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Клиенты] = Клиент;
// Вторая проводка: Д 90 (Капитал) – К 41 (Товары) – себестоимость
Движение = Движения.Управленческий.Добавить();
Движение.СчетДт = ПланыСчетов.Основной.Капитал;
Движение.СчетКт = ПланыСчетов.Основной.Товары;
Движение.Период = Дата;
Движение.Сумма = СтоимостьМатериала *
ВыборкаДетальныеЗаписи.КоличествоВДокументе;
Движение.КоличествоКт = ВыборкаДетальныеЗаписи.КоличествоВДокументе;
Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Материалы] =
ВыборкаДетальныеЗаписи.Номенклатура;
КонецЕсли;
…
В первой проводке мы указываем розничную сумму материала из
документа и субконто дебета, поскольку на счете Дебиторская
задолженность ведется учет в разрезе клиентов.
Во второй проводке мы указываем стоимость материала, количество и
субконто кредита, поскольку на счете Товары ведется количественный
учет в разрезе материалов.
Теперь в самом начале процедуры установим свойство Записы-вать
регистра бухгалтерии в значение Истина для записи изменений
регистров в базу данных (листинг 16.4).
Листинг 16.4. Запись движений регистров
Процедура ОбработкаПроведения(Отказ, Режим)
Движения.ОстаткиМатериалов.Записывать = Истина;
Движения.СтоимостьМатериалов.Записывать = Истина;
Движения.Продажи.Записывать = Истина;
Движения.Управленческий.Записывать = Истина;
…
В заключение отредактируем командный интерфейс формы
документа, чтобы в панели навигации формы иметь возможность
переходить к списку записей регистра Управленческий, связанному с
документом. Для этого откроем форму документа ОказаниеУслуги. В
левом верхнем окне перейдем на закладку Командный интерфейс. В
разделе Панель навигации раскроем группу Перейти и установим
видимость для команды открытия регистра бухгалтерии Управленческий.
В режиме «1С:Предприятие»
Запустим «1С:Предприятие» в режиме отладки, откроем документ
Оказание услуги № 1 и нажмем Провести.
Выполним команду перехода к регистру Управленческий
и посмотрим, какие движения сформировал документ в регистре
бухгалтерии (рис. 16.16, 16.17).
Рис. 16.16. Движения документа «Оказание услуги № 1» в
регистре бухгалтерии «Управленческий»
Рис. 16.17. Движения документа «Оказание услуги № 1» в
регистре бухгалтерии «Управленческий»
После этого перепроведем остальные документы Оказание услуги.
Оборотно-сальдовая ведомость
Теперь нам только осталось создать отчет для бухгалтерии предприятия «На все руки мастер», и наше знакомство с использованием
регистра бухгалтерии будет закончено.
Единственный отчет, которым пользуется бухгалтерия нашего предприятия, – это отчет Оборотно-сальдовая ведомость (рис. 16.18).
Рис. 16.18. Результат отчета
В режиме «Конфигуратор»
Для того чтобы его создать, откроем конфигуратор и добавим новый
объект конфигурации Отчет с именем ОборотноСальдоваяВедо-мость.
Создадим новую схему компоновки данных и добавим Набор данных
– запрос. Откроем конструктор запроса.
Запрос для набора данных
Бухгалтерский отчет Оборотно-сальдовая ведомость представ-ляет
собой таблицу, в строках которой перечислены все имеющиеся в плане
счетов счета, а в колонках – начальное сальдо, оборот и конечное
сальдо по дебету и кредиту каждого счета.
Поэтому нам для построения такого отчета понадобятся две исходные
таблицы:
 объектная (ссылочная) таблица плана счетов Основной;
 виртуальная таблица регистра бухгалтерии Управленческий.
ОстаткиИОбороты (рис. 16.19).
Рис. 16.19. Таблицы запроса
Из таблицы Основной мы выберем поле Ссылка, а из таблицы УправленческийОстаткиИОбороты возьмем следующие поля (рис. 16.20):
 СуммаНачальныйРазвернутыйОстатокДт
,
 СуммаНачальныйРазвернутыйОстатокКт
,  СуммаОборотДт,
 СуммаОборотКт,
 СуммаКонечныйРазвернутыйОстатокДт,
 СуммаКонечныйРазвернутыйОстатокКт.
Рис. 16.20. Выбранные поля
Перейдем на закладку Связи и укажем, что из таблицы Основной мы
будем выбирать все записи, а из таблицы регистра – только те, которые
соответствуют условию связи (рис. 16.21).
Рис. 16.21. Условие связи таблиц
Затем на закладке Объединения/Псевдонимы зададим псевдонимы
полей отчета: Счет, СальдоНачДт, СальдоНачКт, ОборотДт, ОборотКт,
СальдоКонДт и СальдоКонКт (рис. 16.22).
Рис. 16.22. Объединения/Псевдонимы
На этом создание запроса закончено, нажмем ОK.
Ресурсы
Перейдем на закладку Ресурсы и с помощью кнопки Добавить все
ресурсы (>>) выберем все доступные ресурсы.
Параметры
Бухгалтерские отчеты, как правило, формируются для определенного
периода: месяц, квартал, год и т.д. Поэтому на примере нашего отчета
продемонстрируем использование стандартного периода для указания
периода отчета.
На закладке Параметры добавим параметр с именем Период типа
СтандартныйПериод, а для параметров НачалоПериода и КонецПериода укажем Выражение для расчета и запретим их редактирование
пользователем (листинг 16.5).
Листинг 16.5. Выражение для расчета параметров «НачалоПериода»
и «КонецПериода»
&Период.ДатаНачала
&Период.ДатаОкончания
Поскольку бухгалтерские отчеты всегда формируются за определенный период, для параметра Период в колонке Использование
укажем значение Всегда. В результате в отчетной форме не будет
доступен признак использования отчетного периода (флажок слева от
параметра), и параметр будет использоваться всегда, независимо от
желания пользователя.
Таким образом, параметры компоновки данных примут вид (рис.
16.23):
Рис. 16.23. Параметры схемы компоновки данных
Заметим, что даты начала и конца стандартного периода также
содержат и время. Однако здесь, в отличие от параметров НачалоПериода и КонецПериода, начальная дата имеет время 00:00:00, а
конечная дата – 23:59:59. Таким образом, последний день включается
в отчет, и не нужно использовать функцию КонецПериода().
Настройки
В заключение перейдем на закладку Настройки и создадим структуру
отчета. Добавим группировку, содержащую детальные записи. Затем
на закладке Выбранные поля выберем поле Счет, затем реквизит этого
поля Наименование (для этого раскроем поле Счет), а также все
остальные поля для вывода в отчет и разместим их в следующем
порядке (рис. 16.24).
Рис. 16.24. Поля и группировки отчета
На закладке Другие настройки укажем заголовок отчета – Оборотносальдовая ведомость. Для параметра Расположение общих итогов по
вертикали укажем значение Начало и конец.
Затем на закладке Параметры выберем для параметра Период
значение из списка стандартных периодов – Этот месяц (рис. 16.25).
Рис. 16.25. Создание быстрых настроек отчетного периода
Тем самым мы обеспечим, что при открытии формы отчета в
настройке отчетного периода всегда будет указан текущий месяц.
Причем даты начала и конца периода будут динамически меняться в
зависимости от даты выполнения отчета. А также, нажав кнопку
Свойства элемента пользовательских настроек, укажем, что параметр
Период будет включен в состав пользовательских настроек, и эта
настройка будет находиться непосредственно в отчетной форме
(режим редактирования Быстрый доступ).
В заключение определим, в каких подсистемах будет отображаться
наш отчет.
Закроем конструктор схемы компоновки данных и в окне редактирования объекта конфигурации Отчет ОборотноСальдоваяВедомость
перейдем на закладку Подсистемы.
Отметим в списке подсистем конфигурации подсистему Бухгалтерия.
В режиме «1С:Предприятие»
Запустим «1С:Предприятие» в режиме отладки и посмотрим, как
работает отчет.
В разделе Бухгалтерия откроем отчет и нажмем Сформировать (рис.
16.26).
Рис. 16.26. Результат отчета
Мы видим, что стандартный период отчета задан по умолчанию – Этот
месяц. Пользоваться стандартным периодом отчета очень удобно,
когда пользователь регулярно выполняет отчет за определенный
интервал времени. Тогда можно заранее установить в настройках
нужный период, и пользователю не придется задавать его перед 
формированием отчета. Но при желании в режиме 1С:Предприятие
пользователь может выбрать другой период из списка стандартных
периодов.ЗАНЯТИЕ 16
План видов расчета,
регистр расчета
На этом занятии мы познакомимся с объектами конфигурации План
видов расчета и Регистр расчета и узнаем об основных понятиях,
используемых при создании сложных периодических расчетов.
В конце занятия мы создадим план видов расчета и регистр расчета,
на основе которых на следующем занятии продемонстрируем работу
механизмов периодических расчетов.
Зачем нужен план видов расчета
и регистр расчета?
На этом занятии мы рассмотрим, какие возможности для автоматизации сложных периодических расчетов предоставляет система
«1С:Предприятие».
Такие расчеты используются прежде всего при расчете заработной
платы. Поэтому дальнейшее их рассмотрение мы будем строить на
примере расчета заработной платы сотрудников, которые работают в
нашем ООО «На все руки мастер».
В общем случае сумма заработной платы сотрудника складывается из
множества частей (например, оплата по окладу, премии, штрафы,
оплаты по больничному листу, разовые выплаты и т.д.). Каждая из
этих частей рассчитывается по некоторому алгоритму, присущему
только этой части.
Например, сумма штрафа может определяться просто фиксированной
суммой, сумма премии может рассчитываться как процент от оклада,
а сумма оплаты по окладу рассчитывается исходя из количества
рабочих дней в месяце и количества дней, отработанных
сотрудником. Поэтому для обозначения каждой такой части мы
будем использовать термин вид расчета.
Алгоритм каждого вида расчета опирается в общем случае на две
категории параметров: период, за который нужно получить конечные
данные, и набор некоторых исходных данных, используемых при
расчете.
Как правило, в реальной жизни различные виды расчета существуют
не сами по себе, а оказывают некоторое влияние на другие виды
расчета. Исходя из того, что вид расчета опирается на две различные
категории параметров, такое влияние тоже имеет двойственный
характер.
Зависимость по базовому периоду
Это может быть влияние на исходные данные, используемые при
расчете.
В качестве примера можно привести начисление премии в виде
процента от оплаты по окладу. При изменении оплаты по окладу
размер премии тоже должен быть пересчитан, исходя из новой суммы
начисленного оклада. Другими словами, сумма начисленного оклада
является базой для расчета премии.
Причем поскольку оклад рассчитывается за некоторый период, при
расчете премии нам интересно знать не значение оклада вообще, а
сумму, начисленную в том периоде, который влияет на расчет
премии. Такой период мы будем называть базовым, а подобную зависимость между видами расчета – зависимостью по базовому периоду.
В качестве примера рассмотрим начисление премии за апрель.
Премия должна начисляться в размере 10 % от суммы, начисленной в
качестве оплаты по окладу. Следовательно, необходимо проанализировать все записи о начислениях оплаты по окладу, которые
попадают в интересующий нас базовый период, а именно апрель.
Допустим, общая сумма таких начислений составила 8000 рублей – в
этом случае премия должна быть начислена в размере 800 рублей
(рис. 17.1).
Рис. 17.1. Зависимость премии от оклада по базовому периоду
Вытеснение по периоду действия
Это влияние может быть не на исходные данные, а на сам период, за
который производится расчет.
В качестве примера можно привести расчет оплаты по окладу и
невыход на работу. Предположим, мы начислили сотруднику оплату
по окладу за март. В этом случае период действия такого расчета
будет с 01.03.2013 по 31.03.2013.
После этого мы получили информацию от руководителя отдела, что,
оказывается, сотрудник отсутствовал на работе с 1 по 10 марта по
неизвестной причине. В этом случае нам нужно будет произвести
расчет Невыход (в котором можно рассчитать какие-то удержания с
сотрудника).
Но кроме этого необходимо будет пересчитать и оклад сотрудника,
исходя из того, что фактический период действия расчета Оклад стал
теперь с 11.03.2013 по 31.03.2013.
Такое влияние мы будем называть вытеснением по периоду
действия.
В результате если за полный месяц работы сотруднику должно было
быть начислено 9300 рублей, то теперь, за фактический период
работы, начисление составит 6300 рублей (рис. 17.2).
Рис. 17.2. Запись расчета «Невыход» вытесняет
запись расчета «Оклад» по периоду действия
Таким образом, исходя из двух видов взаимного влияния расчетов,
можно сказать, что в общем случае с каждым видом расчета будет
связано три периода: период действия, фактический период и
базовый период.
 Период действия является «запрашиваемым». То есть, указывая
период действия, мы говорим: «Мы хотели бы, чтобы результат
действовал в этом периоде».
 Фактический период – это то, что получилось из периода действия после анализа всех периодов действия расчетов, которые
вытесняют наш по периоду действия.
 Базовый период – это период, в котором мы анализируем результаты других расчетов, влияющих на наш по базовому периоду.
Как видите, взаимное влияние между видами расчетов может быть
довольно разнообразным и, что самое сложное, многоуровневым. То
есть один вид расчета может влиять на другой, который, в свою
очередь, влияет на третий и т.д.
Очевидно, что в этой ситуации требуется некий универсальный
механизм, позволяющий описать каждый из видов расчетов (его
алгоритм, влияние на другие виды расчетов, зависимость от других
видов расчетов), обеспечить хранение данных, полученных в результате этих расчетов, и контроль необходимости перерасчета результатов зависимых расчетов в случае изменения результатов первичных
расчетов.
В системе «1С:Предприятие» такой универсальный механизм реализован при помощи планов видов расчета и регистров расчета.
И первым объектом конфигурации, с которым мы начнем
знакомиться на этом занятии, будет План видов расчета.
Что такое план видов расчета
Объект конфигурации План видов расчета предназначен для
описания структуры хранения информации о возможных видах
расчетов. На основе объекта конфигурации План видов расчета
платформа создает в базе данных таблицу, в которой будет храниться
информация о том, какие существуют виды расчета и каковы взаимосвязи между ними.
Отличительной особенностью плана видов расчета является то, что
пользователь в процессе работы может добавлять новые виды
расчета. Такая возможность делает механизм периодических
расчетов более гибким и позволяет пользователю создавать
собственные виды расчета, помимо тех, которые заданы
разработчиком как предопреде-ленные.
Объект конфигурации План видов расчета имеет свойство Использует
период действия. С его помощью определяется, будут ли в этом
плане находиться виды расчета, которые могут быть вытеснены по
периоду действия.
Если это свойство установлено, то разработчик получает возможность указать для каждого вида расчета те виды, которые вытесняют
его по периоду действия.
Следующим важным свойством объекта конфигурации План видов
расчета является Зависимость от базы. Оно определяет, будут ли в
этом плане находиться зависимые по базовому периоду виды расчета.
Если это свойство установлено, появляется возможность указать, в
каком плане видов расчета будут находиться базовые виды расчета и,
кроме этого, как будет определяться эта зависимость.
Существует возможность указать один из двух видов зависимости от
базы: Зависимость по периоду действия и Зависимость по периоду
регистрации. Оба вида этой зависимости подробно рассмотрены в
разделе «Что такое Регистр расчета».
Еще одной важной особенностью плана видов расчета является
возможность создания предопределенных видов расчета и описания
их взаимного влияния. При этом в общем случае разработчик имеет
возможность указать три категории видов расчета, влияющих на
предопределенный вид расчета:
 Базовые – их результаты должны быть использованы при
перерас-чете этого вида расчета;
 Вытесняющие – вытесняют этот вид расчета по периоду
действия;
 Ведущие – изменение их результатов должно приводить к необходимости перерасчета этого вида расчета.
Здравый смысл подсказывает, что все базовые виды расчета должны
быть включены и в категорию ведущих. Кроме этого, ведущие виды
расчета могут содержать и некоторые другие виды, косвенно
влияющие на данный вид расчета.
Например, мы имеем три вида расчета: Невыход, Оклад и Премия.
Невыход вытесняет Оклад по периоду действия, а Премия зависит от
оклада по базовому периоду.
В этом случае для премии следует указать базовым видом расчета
оклад, а ведущими – оклад и невыход, поскольку изменение результата расчета невыхода приведет к изменению результата оклада, что,
в свою очередь, должно привести к изменению результата премии
(рис. 17.3).
Рис. 17.3. Взаимное влияние видов расчетов
УЗНАЙ БОЛЬШЕ!
О структуре объектов встроенного языка, предназначенных для
работы с планом видов расчета, можно прочитать в разделе
«Краткий справочник разработчика. Планы видов расчета».
Добавление плана видов расчета
Приступим теперь к созданию плана видов расчета ОсновныеНачисления, который будет использоваться в нашей конфигурации.
В режиме «Конфигуратор»
Откроем конфигуратор и создадим новый объект конфигурации План
видов расчета.
Зададим его имя – ОсновныеНачисления, а также зададим Представление списка как Виды расчетов.
На закладке Подсистемы укажем, что план видов расчета будет
отображаться в подсистеме РасчетЗарплаты.
На закладке Расчет укажем, что он будет использовать период
действия и зависеть от базы по периоду действия.
В качестве базового плана видов расчета укажем его самого,
поскольку все наши виды расчетов будут храниться в единственном
плане видов расчета (рис. 17.4).
Рис. 17.4. Определим использование периода действия,
зависимость от базы и базовые планы видов расчета
Перейдем на закладку Прочее и зададим предопределенные виды
расчета.
Как и в случае с бухгалтерией, расчеты в нашем ООО «На все руки
мастер» будут скромные, поэтому мы создадим всего три элемента
(рис. 17.5):
 Невыход – с именем и наименованием Невыход и кодом
Невыход;
 Оклад – с именем, кодом и наименованием Оклад, с вытесняющим его видом расчета Невыход и ведущим видом расчета
Невыход;
 Премия – с именем, кодом и наименованием Премия, с базо-вым
видом расчета Оклад и ведущими видами расчета Невыход и
Оклад.
Рис. 17.5. Предопределенные виды расчета для
плана видов расчета «ОсновныеНачисления»
Теперь мы перейдем к рассмотрению второго объекта, используемого
при реализации механизмов сложных периодических расчетов, –
регистра расчета.
Что такое регистр расчета
Объект конфигурации Регистр расчета предназначен для описания
структуры накопления данных, являющихся результатами расчетов.
На основе объекта конфигурации Регистр расчета платформа создает в
базе данных таблицы, в которых будут накапливаться данные,
формируемые различными объектами базы данных.
Отличительной особенностью регистра расчета является то, что он не
предназначен для интерактивного редактирования пользователем.
Разработчик может при необходимости предоставить пользователю
возможность редактировать регистр расчета, но предназначение
регистра расчета заключается в том, чтобы его модификация производилась на основе алгоритмов работы объектов базы данных, а не в
результате непосредственных действий пользователя.
Как и другие регистры, регистр расчета имеет ресурсы, в которых
хранит числовые данные; имеет измерения, в разрезе которых можно
получать значения ресурсов регистра; имеет реквизиты, которые
характеризуют каждую запись регистра расчета.
Отличительными же особенностями регистра расчета является его
периодичность, возможность использования механизмов вытес-нения
по периоду действия и зависимости по базовому периоду, а также
связь с планом видов расчета. Рассмотрим все эти особенности по
порядку.
Периодичность
Периодичность регистра расчета может быть определена одним из
следующих значений:
 День,
 Месяц,
 Квартал,
 Год.
Периодичность регистра расчета определяет промежуток времени, к
которому будет относиться каждая запись регистра.
Если указана периодичность День, то каждая запись регистра будет
относиться к какому-либо дню; если периодичность – Месяц, то к
какому-либо месяцу и т.д.
Для указания факта принадлежности записи к какому-либо периоду
регистр имеет служебный реквизит ПериодРегистрации типа Дата.
При записи данных в регистр платформа всегда приводит значение
этого реквизита к началу того периода, в который он попадает.
Например, если в регистр расчета с периодичностью месяц записать
данные, где ПериодРегистрации задан как 08.04.2004, то регистр
сохранит эти данные со значением поля ПериодРегистрации
01.04.2004 (рис. 17.6).
Если в этой же ситуации периодичность регистра будет год, сохраненное значение периода регистрации будет 01.01.2004 (рис. 17.7).
Рис. 17.6. Запись данных из документа в регистр расчета видов расчета
Рис. 17.7. Запись данных из документа в регистр расчета видов расчета
Вытеснение по периоду действия
Следующей важной особенностью регистра расчета является возможность использования механизма вытеснения одних записей другими
по периоду действия.
При этом для каждой записи регистр расчета формирует фактический период действия, который является в общем случае совокупностью нескольких периодов, расположенных внутри периода действия
(рис. 17.8).
Рис. 17.8. Запись расчета «Невыход» вытесняет запись
расчета «Оклад» по периоду действия
Если рассмотреть структуру записей таблиц регистра расчета, то
после внесения записи о начислении по окладу таблицы регистра
будут выглядеть следующим образом (таблицы 17.1, 17.2).
Таблица 17.1. Таблица регистра расчета
… Начало периода
действия
… …
… 01.04.2013
00:00:00
… …
Конец периода действия
…
30.04.2013 23:59:59
…
Вид расчета …
… …
Оклад …
… …
Таблица 17.2. Таблица фактического периода действия
… Начало периода
действия
… …
… 01.04.2013
00:00:00
… …
Конец периода действия
…
30.04.2013 23:59:59
…
Вид расчета …
…
… Оклад
…
… …
После добавления в регистр записи вида расчета Невыход, который
вытесняет вид расчета Оклад по периоду действия, записи о начислении по окладу примут следующий вид (таблицы 17.3, 17.4).
Таблица 17.3. Таблица регистра расчета
… Начало периода
действия
… …
… 01.04.2013
00:00:00 …
04.04.2013 00:00:00
… …
Конец периода действия
…
30.04.2013
23:59:59
10.04.2013
23:59:59
…
Вид расчета …
… …
Оклад …
Невыход …
… …
Таблица 17.4. Таблица фактического периода действия
… Начало периода
действия
… …
… 01.04.2013
00:00:00 …
11.04.2013 00:00:00
… …
Конец периода действия
…
03.04.2013
23:59:59
31.04.2013
23:59:59
…
Вид расчета …
… …
Оклад …
Оклад …
… …
Зависимость по базовому периоду
Другим механизмом, который поддерживает регистр расчета,
является зависимость записей по базовому периоду. Этот механизм
позволяет основывать расчет зависимых (вторичных)
записей регистра на данных, полученных в результате 
расчета первичных записей.
Регистр расчета может поддерживать два вида зависимости от базы:
зависимость по периоду действия и зависимость по периоду регистрации
Зависимость по периоду действия
Зависимость по периоду действия означает, что при анализе базовых
записей будут выбираться те, для которых найдено пересечение их
фактического периода действия и указанного базового периода.
Например, в начале апреля производится расчет зарплаты за март.
Премия за март должна быть начислена исходя из оплаты по окладу
за март. В этом случае, как правило, используется зависимость по
периоду действия (рис. 17.9).
Рис. 17.9. Зависимость по периоду действия
Следует сделать два замечания к приведенному рисунку.
Поля Начало базового периода и Конец базового периода имеют
смысл только для записей тех видов расчета, для которых определена
зависимость по базовому периоду (в нашем случае для записи
расчета премии).
Значение базы, которая будет получена от конкретной влияющей
записи, в общем случае не равно результату, который содержит эта
запись. База будет рассчитана пропорционально тому, какую часть от
фактического интервала влияющей записи составляет перекрывающийся с указанным базовым периодом участок. При этом будут
использованы данные графика, связанного с записью.
Зависимость по периоду регистрации
Зависимость по периоду регистрации означает, что при анализе
базовых записей будут выбираться те, которые попадают в указанный
базовый период значением своего поля Период регистрации.
В качестве примера можно привести расчет штрафов при начислении зарплаты за март. В качестве базы для расчета суммы штрафов
должны браться записи о прогулах, зарегистрированные в марте
месяце (это могут быть как записи о мартовских прогулах, так и
записи о прогулах в феврале). В этом случае, как правило, используется зависимость по периоду регистрации (рис. 17.10).
Рис. 17.10. Зависимость по периоду регистрации
Важной заключительной особенностью регистра расчета является его
связь с планом видов расчета. Именно на основе этой связи работают
механизмы вытеснения по периоду действия и зависимости по
базовому периоду, поскольку в плане видов расчета описано
взаимное влияние видов расчета друг на друга.
У регистра расчета могут существовать подчиненные объекты Перерасчет. Они предназначены для регистрации фактов появления в
регистре записей, влияющих на результат расчета уже существующих записей регистра. Объект конфигурации Перерасчет может
иметь несколько измерений, каждое из которых устанавливает связь
между измерениями данного регистра расчета и влияющих регистров
расчета. В частном случае это может быть один и тот же регистр.
В таблице, созданной в базе данных на основе объекта конфигурации Перерасчет, платформа хранит информацию о том, какие
записи регистра подлежат перерасчету. Таблицы перерасчета заполняются автоматически как на основании записей регистров расчета,
затронутых ведущими видами расчета, так и на основании записей
регистра расчета, для которых изменился фактический период
действия. Исходя из этой информации, разработчик может принимать
решение о необходимости перерасчета записей регистра.
Последним замечанием, которое следует сделать, говоря о регистре
расчета, является возможность установки связи регистра расчета с
графиком. Такой график должен представлять собой регистр
сведений (непериодический, с обязательным измерением типа Дата и
ресурсом типа Число), в котором содержится временная схема
исходных данных, участвующих в расчетах. Измерениями этого
графика могут быть, например, график работы (ссылка на справочник) и дата, а ресурсом – количество рабочих часов в этой дате. В
этом случае можно будет связать запись регистра расчета с какимлибо конкретным графиком работы (указав в качестве реквизита
записи ссылку на справочник ВидыГрафиковРаботы) и в дальнейшем
средствами встроенного языка получать информацию о количестве
рабочих часов в периоде действия, фактическом периоде действия
или периоде регистрации этой записи.
УЗНАЙ БОЛЬШЕ!
О структуре объектов встроенного языка, предназначенных для
работы с регистром расчета, можно прочитать в разделе «Краткий
справочник разработчика. Регистры расчета».
Добавление регистра расчета
Прежде чем мы начнем создавать объект конфигурации Регистр
расчета Начисления, нам потребуется создать два дополнительных
объекта конфигурации:
 регистр сведений ГрафикиРаботы,
 справочник ВидыГрафиковРаботы.
Справочник понадобится нам для хранения информации о том, какие
графики работы существуют в ООО «На все руки мастер», а регистр
сведений – для указания того, какие дни в месяце являются
рабочими, поскольку сумма оплаты по окладу будет рассчитываться
исходя из того, сколько дней отработал сотрудник в расчетном
месяце.
В режиме «Конфигуратор»
Откроем конфигуратор и создадим новый объект конфигурации Справочник с именем ВидыГрафиковРаботы.
На закладке Подсистемы укажем, что справочник будет отображаться
в подсистеме РасчетЗарплаты.
На закладке Прочее создадим для справочника два
предопределенных графика работы (рис. 17.11) –
ГрафикАдминистрации и ГрафикМас-теров.
Рис. 17.11. Предопределенные графики работы
После этого создадим объект конфигурации Регистр сведений с
именем ГрафикиРаботы.
Этот регистр будет иметь два измерения:
 ГрафикРаботы, тип СправочникСсылка.ВидыГрафиковРаботы;
 Дата, тип Дата.
Затем создадим единственный ресурс регистра – Значение с типом
Число, длиной 1. На закладке Подсистемы укажем, что регистр
сведений будет отображаться в подсистеме РасчетЗарплаты. Теперь
заполним регистр сведений ГрафикиРаботы данными о рабочих днях
июля графика мастеров.
В режиме «1С:Предприятие»
Запустим «1С:Предприятие» в режиме отладки и в разделе Расчет
зарплаты выполним команду Графики работы. Поочередно создадим
31 запись в регистре за месяц, в котором были сделаны начисления.
Чтобы проще выполнить эту довольно однообразную работу,
воспользуйтесь возможностью добавления элементов в регистр копированием текущего элемента (команда Еще > Скопировать (F9)). В
качестве измерения ГрафикРаботы нашего регистра выберем предопределенный элемент График мастеров справочника ВидыГрафиковРаботы. В качестве ресурса Значение у рабочих дней проставим 1, а у
выходных – 0 (рис. 17.12).
Рис. 17.12. Записи регистра «Графики работы»
Теперь все готово для создания регистра расчета.
В режиме «Конфигуратор»
Добавим новый объект конфигурации Регистр расчета с именем
Начисления. Зададим Расширенное представление списка как
Движения в регистре Начисления. В качестве плана видов расчета,
используемого регистром, выберем ОсновныеНачисления.
Установим, что регистр будет использовать период действия, график
будет задаваться в регистре сведений ГрафикиРаботы, значение
графика будет находиться в ресурсе Значение, а дата графика – в
измерении Дата.
Укажем, что регистр расчета будет использовать базовый период и
периодичность регистра будет Месяц (рис. 17.13).
Рис. 17.13. Окно редактирования регистра расчета «Начисления»
На закладке Подсистемы укажем, что регистр расчета будет отображаться в подсистеме РасчетЗарплаты.
Затем перейдем на закладку Данные и создадим (рис. 17.14):
 измерение Сотрудник, тип СправочникСсылка.Сотрудники,
Базовое;
 ресурс Результат, тип Число, длина 15, точность 2,
 реквизит ГрафикРаботы, тип СправочникСсылка.ВидыГрафиковРаботы, в разделе свойств Данные зададим свойство Связь с
графиком по измерению ГрафикРаботы;
 реквизит ИсходныеДанные, тип Число, длина 15, точность 2.
Реквизит ГрафикРаботы мы будем использовать для того, чтобы
связать запись регистра с используемым графиком работы, а реквизит
ИсходныеДанные – чтобы хранить в нем данные, которые могут
пона-добиться при расчете или перерасчете (в нашем примере это
будет расчет оклада).
Рис. 17.14. Измерения, ресурсы и реквизиты регистра расчета
Теперь перейдем на закладку Перерасчеты. Создадим объект конфигурации Перерасчет, который так и назовем – Перерасчет.
У него будет единственное измерение – Сотрудник, для которого в
разделе Связь мы укажем:
 измерение регистра – Сотрудник;
 данные ведущих регистров – выберем то же самое измерение
Сотрудник регистра расчета Начисления (рис. 17.15).
Рис. 17.15. Перерасчеты регистра
В заключение отредактируем командный интерфейс, чтобы в разделе
Расчет зарплаты была доступна команда для просмотра записей регистра
расчета.
Для этого в дереве объектов конфигурации выделим подсистему
РасчетЗарплаты, вызовем контекстное меню и выполним команду
Открыть командный интерфейс.
В открывшемся окне командного интерфейса подсистемы в группе
Панель навигации.Обычное включим видимость у команды Начис-ления.
На этом создание объекта конфигурации Регистр расчета Начисления
завершено.ЗАНЯТИЕ 17
Использование
регистра расчета
Теперь у нас все готово для того, чтобы начать разработку системы
расчета заработной платы ООО «На все руки мастер».
В этой главе мы создадим документ, с помощью которого будут
выполняться различные виды начислений; посмотрим, как и когда
платформа формирует записи перерасчета; увидим, как работают
механизмы вытеснения по периоду действия и зависимости по
базовому периоду.
Кроме этого, мы создадим отчет, показывающий начисления сотрудникам ООО «На все руки мастер», и сделаем так, чтобы данные
расчетов можно было поддерживать в актуальном состоянии.
В заключение мы познакомимся с новым элементом формы –
Диаграмма Ганта – и с его помощью наглядно проиллюстрируем
работу некоторых механизмов расчета.
Добавление документа о начислениях
Для того чтобы иметь возможность регистрировать в базе данных
начисления, производимые сотрудникам ООО «На все руки мастер»,
нам понадобится специальный документ.
В режиме «Конфигуратор»
Откроем конфигуратор и добавим новый объект конфигурации
Документ. Назовем его НачисленияСотрудникам. Зададим представление объекта как Начисление сотрудникам. На закладке Нумерация
установим:
 Тип номера – Число,
 Длина номера – 5 (рис. 18.1).
На закладке Подсистемы укажем, что документ будет отображаться в
подсистеме РасчетЗарплаты.
На закладке Данные укажем, что этот документ будет иметь
табличную часть Начисления, содержащую следующие реквизиты:
 Сотрудник, тип СправочникСсылка.Сотрудники;
 ГрафикРаботы, тип СправочникСсылка.ВидыГрафиковРаботы;
 ДатаНачала, тип Дата;
 ДатаОкончания, тип Дата;
 ВидРасчета, тип ПланВидовРасчетаСсылка.ОсновныеНачисления;
 Начислено, Число, длина 15, точность 2.
Рис. 18.1. Нумерация документа
Реквизиты ДатаНачала и ДатаОкончания понадобятся нам для того,
чтобы задавать период, в котором должна действовать запись расчета.
На закладке Движения запретим оперативное проведение документа.
Отметим, что документ будет создавать движения по регистру
расчета Начисления, и запустим конструктор движений (рис. 18.2).
Рис. 18.2. Движения документа
В окне конструктора выберем табличную часть Начисления и нажмем
Заполнить выражения.
Для реквизитов ПериодДействияКонец и БазовыйПериодКонец
укажем выражение КонецДня(ТекСтрокаНачисления.ДатаОкончания).
Для поля ПериодРегистрации укажем выражение Дата.
Реквизиту ИсходныеДанные поставим в соответствие реквизит
табличной части Начислено, а для ресурса Результат оставим пустое
выражение, так как мы будем его потом рассчитывать (рис. 18.3).
Рис. 18.3. Движения документа «НачисленияСотрудникам»
по регистру расчета
Нажмем OK и посмотрим текст обработчика, созданный конструктором (листинг 18.1).
Листинг 18.1. Текст обработчика, созданный конструктором движений
Процедура ОбработкаПроведения(Отказ, Режим)
//{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ //
Данный фрагмент построен конструктором
// При повторном использовании конструктора
// внесенные вручную изменения будут утеряны!!!
Движения.Начисления.Записывать = Истина;
// Регистр Начисления
Для Каждого ТекСтрокаНачисления Из Начисления Цикл
Движение = Движения.Начисления.Добавить();
Движение.Сторно = Ложь;
Движение.ВидРасчета = ТекСтрокаНачисления.ВидРасчета;
Движение.ПериодДействияНачало = ТекСтрокаНачисления.ДатаНачала;
Движение.ПериодДействияКонец =
КонецДня(ТекСтрокаНачисления.ДатаОкончания);
Движение.ПериодРегистрации = Дата;
Движение.БазовыйПериодНачало = ТекСтрокаНачисления.ДатаНачала;
Движение.БазовыйПериодКонец = КонецДня(ТекСтрокаНачисления.ДатаОкончания);
Движение.Сотрудник = ТекСтрокаНачисления.Сотрудник;
Движение.ГрафикРаботы = ТекСтрокаНачисления.ГрафикРаботы;
Движение.ИсходныеДанные = ТекСтрокаНачисления.Начислено;
КонецЦикла;
//}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
КонецПроцедуры
Прокомментируем этот код.
В целом в нем нет ничего принципиально нового по сравнению с
прежними обработчиками проведения документов, создающими
движения регистров.
Напомним лишь, что Начисления – имя регистра расчета, и в выражениях Движения.Начисления.Записывать() и Движения.Начисления.Добавить() мы обращаемся к методам набора записей этого
регистра.
В строке Для Каждого ТекСтрокаНачисления Из Начисления Цикл мы
обращаемся по имени (Начисления) к табличной части нашего
документа и организуем цикл обхода этой табличной части.
В цикле мы добавляем к движениям новую запись и присваиваем ее
полям значения из табличной части документа.
Для присвоения значений полям ПериодДействияКонец, БазовыйПериодКонец мы используем функцию КонецДня(). Аналогичным
образом мы поступали при создании отчетов, чтобы последний день
периода попал в отчет.
В заключение отредактируем командный интерфейс, чтобы в разделе
Расчет зарплаты была доступна команда создания новых документов.
Для этого в дереве объектов конфигурации выделим подсистему
РасчетЗарплаты, вызовем контекстное меню и выполним команду
Открыть командный интерфейс.
В группе Панель действий.Создать включим видимость у команды
Начисление сотрудникам: создать (рис. 18.4).
Рис. 18.4. Редактирование командного интерфейса подсистемы
В режиме «1С:Предприятие»
Запустим «1С:Предприятие» в режиме отладки и посмотрим, как
работает наш документ.
В разделе Расчет зарплаты выполним команду Создать > Начисление сотрудникам и начислим оклад за октябрь всем сотрудникам
ООО «На все руки мастер» (рис. 18.5).
Проведем документ и посмотрим, какие движения он сформировал в
регистре Начисления (рис. 18.6, 18.7).
Обратите внимание на то, что платформа привела период
регистрации каждой записи к началу периода регистра расчета –
началу месяца (в обработчике проведения мы указывали значение
даты документа – 24.10.2022).
Рис. 18.5. Документ «Начисления сотрудникам № 1»
Рис. 18.6. Движения документа «Начисление сотрудникам № 1» в
регистре расчета «Начисления»
Рис. 18.7. Движения документа «Начисление сотрудникам № 1» в
регистре расчета «Начисления»
Кроме этого заметьте, что в каждой записи мы сохранили в реквизите
ИсходныеДанные размер оклада сотрудника, введенный в документе,
чтобы в дальнейшем рассчитать сумму оплаты по окладу.
Для дальнейшего изучения работы регистра расчета нам понадобится
служебный отчет, с помощью которого мы сможем посмотреть
содер-жимое записей перерасчета.
Иллюстрация механизмов вытеснения
и зависимости от базы
Отчет по перерасчетам
В режиме «Конфигуратор»
Создадим новый объект конфигурации Отчет. Назовем его Перерасчет. Создадим основную схему компоновки данных, добавим
источник данных – запрос и откроем конструктор запроса.
В списке База данных раскроем ветвь Перерасчеты и из виртуальной
таблицы перерасчета Начисления.Перерасчет выберем все поля:
 ОбъектПерерасчета,
 ВидРасчета,
 Сотрудник (рис. 18.8).
Рис. 18.8. Поля и таблицы запроса
На этом создание запроса закончено, нажмем ОK.
Перейдем на закладку Настройки и добавим группировку детальных
записей. На закладке Выбранные поля выберем для вывода в отчет
поля ОбъектПерерасчета, ВидРасчета и Сотрудник.
На этом создание схемы компоновки данных закончено, закроем ее.
В окне редактирования объекта конфигурации Отчет Перерасчет на
закладке Подсистемы укажем, что отчет будет принадлежать
подсистеме РасчетЗарплаты.
Зависимость по базовому периоду
В режиме «1С:Предприятие»
Если сейчас мы выполним отчет в режиме 1С:Предприятие, то мы
увидим, что ни один перерасчет еще не выполнялся.
Поэтому создадим новый документ Начисление сотрудникам
№ 2, в котором начислим премию за октябрь Гусакову и Деловому
(рис. 18.9).
Рис. 18.9. Документ «Начисления сотрудникам № 2»
Этим документом мы зафиксируем тот факт, что сотрудникам
Гусакову и Деловому нужно начислить премию по итогам работы за
октябрь. Поскольку размер премии нам неизвестен (он будет рассчитываться по некоторому алгоритму), поле Начислено мы оставляем
пустым. Нажмем Провести и закрыть.
Теперь снова откроем документ Начисление сотрудникам № 1 и
изменим оклад Гусакова с 10000 на 7000. Нажмем Провести и
закрыть.
Сформируем отчет Перерасчет (рис. 18.10).
Рис. 18.10. Отчет «Перерасчет»
Как видите, отчет теперь содержит какие-то данные.
В самом деле вид расчета Премия зависит у нас по базовому периоду
от вида расчета Оклад. Как только мы изменили существовавшие в
регистре записи по виду расчета Оклад, платформа сразу же сформировала набор записей перерасчета, которые должны быть рассчитаны заново, так как изменилась их база.
Вы можете спросить: почему в перерасчет попали записи как про
Делового, так и про Гусакова, хотя оклад мы меняли только
Гусакову?
Дело в том, что платформа не отслеживает конкретные изменения,
которые пользователь внес в записи документа. Она отслеживает
лишь факт изменения набора записей регистра расчета в результате
проведения (перепроведения) документа.
Поэтому в набор записей перерасчета она включает информацию обо
ВСЕХ записях регистра, значение ресурсов которых МОЖЕТ измениться в результате перепроведения документа, создавшего базовые
записи регистра.
Перепроведем документ Начисления сотрудникам № 2 (которым мы
начисляли премию) и сформируем отчет Перерасчет.
Он снова не содержит никаких данных – система отметила тот факт,
что мы «пересчитали» зависимые записи, и очистила таблицу перерасчета.
На этом примере мы с вами познакомились с работой механизма
поддержки зависимости по базовому периоду у регистра расчета.
Вытеснение по периоду действия
В режиме «1С:Предприятие»
Теперь посмотрим, как работает механизм вытеснения по периоду
действия.
Для этого нам понадобится создать документ Начисления сотрудникам № 3 (рис. 18.11).
Этим документом мы зафиксируем тот факт, что Гусаков не выходил
на работу с 1 по 10 октября.
Очевидно, что в этом случае потребуется пересчитать его оплату по
окладу и, как следствие, – начисленную премию.
Рис. 18.11. Документ «Начисления сотрудникам № 3»
Нажмем Провести и закрыть и затем сформируем отчет Перерасчет
(рис. 18.12).
Рис. 18.12. Отчет «Перерасчет»
Как вы видите, в перерасчет попала запись о начислении оклада
Гусакову. Это явилось результатом работы механизма вытеснения по
периоду действия, ведь вид расчета Невыход вытесняет у нас вид
расчета Оклад.
Обратите внимание, что в перерасчет попала и запись о начислении
премии Гусакову.
Если вы помните, при создании предопределенных видов расчета мы
указали, что результат вида расчета Премия будет зависеть от
изменения результата вида расчета Невыход. Эта зависимость
косвенная, но поскольку мы явно указали такую зависимость,
платформа ее отследила.
Перепроведем документы Начисления сотрудникам № 1 и № 2 и
убедимся, что таблица перерасчета очистилась.
Процедура расчета записей
регистра расчета
В режиме «Конфигуратор»
До сих пор мы с вами просто заносили в регистр расчета Начисления
записи о том, что необходимо выполнить какой-либо вид расчета. Но
каким именно образом получать эти результаты, мы не говорили.
Теперь настало время описать алгоритмы формирования различных
видов расчетов.
Поскольку эти алгоритмы нужно будет использовать не только в
документе Начисление сотрудникам, удобнее всего будет разместить
их в отдельном общем модуле.
Откроем в конфигураторе текст обработчика проведения документа
НачисленияСотрудникам и добавим в него после завершения
создания движений в регистре Начисления вызов процедуры
РассчитатьНачис-ления() из общего модуля ПроведениеРасчетов
(листинг 18.2).
Листинг 18.2. Обработчик проведения документа
«НачисленияСотрудникам»
Процедура ОбработкаПроведения(Отказ, Режим) …
КонецЦикла;
//}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
// Записываем движения регистров
Движения.Начисления.Записать();
// Получим список всех сотрудников, содержащихся в документе
Запрос = Новый Запрос(
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| НачисленияСотрудникамНачисления.Сотрудник
|ИЗ
| Документ.НачисленияСотрудникам.Начисления КАК
| НачисленияСотрудникамНачисления
|
|ГДЕ
| НачисленияСотрудникамНачисления.Ссылка = &ТекущийДокумент");
Запрос.УстановитьПараметр("ТекущийДокумент", Ссылка);
// Сформируем список сотрудников ТаблЗнач
= Запрос.Выполнить().Выгрузить();
МассивСотрудников = ТаблЗнач.ВыгрузитьКолонку("Сотрудник");
// Вызов процедуры РассчитатьНачисления из общего модуля
ПроведениеРасчетов.РассчитатьНачисления(Движения.Начисления,
ПланыВидовРасчета.ОсновныеНачисления.Оклад, МассивСотрудников);
Движения.Начисления.Записать( , Истина);
ПроведениеРасчетов.РассчитатьНачисления(Движения.Начисления,
ПланыВидовРасчета.ОсновныеНачисления.Премия, МассивСотрудников);
Движения.Начисления.Записать( , Истина);
КонецПроцедуры
Обратите внимание: при проведении документа мы сначала записываем движения, сформированные документом, в регистр (Движения.
Начисления.Записать()), а затем передаем этот набор записей регистра
в процедуру расчета РассчитатьНачисления(), которую мы создадим в
общем модуле ПроведениеРасчетов.
Эту процедуру мы вызываем сначала для расчета первичных записей
(Оклад), а затем для расчета вторичных (Премия).
Процедура расчета на основе описанных в ней алгоритмов и данных,
содержащихся в записях регистра, должна сформировать значения
ресурсов регистра.
После того как ресурсы будут рассчитаны, мы перезаписываем набор
записей регистра без формирования записей перерасчета (второй
параметр в методе Записать() – Истина).
Перед вызовом процедуры из общего модуля мы с помощью запроса
формируем массив сотрудников, перечисленных в документе, чтобы
передать его в вызываемую процедуру.
Для параметра запроса ТекущийДокумент устанавливаем значение
стандартного реквизита документа – Ссылка. Используя метод
запроса Запрос.Выполнить().Выгрузить(), выгружаем
результат запроса в таблицу
значений (переменную ТаблЗнач). Затем формируем массив
МассивСотрудников, содержащий колонку Сотрудник из этой таблицы
значений.
Теперь создадим в ветке Общие новый общий модуль ПроведениеРасчетов.
Установим флажок Вызов сервера для видимости его экспортных
процедур и функций (рис. 18.13).
Рис. 18.13. Свойства общего модуля
Добавим в него заготовку процедуры РассчитатьНачисления (листинг
18.3).
Листинг 18.3. Заготовка процедуры «РассчитатьНачисления»
Процедура РассчитатьНачисления(НаборЗаписейРегистра
, ТребуемыйВидРасчета, СписокСотрудников) Экспорт
Регистратор = НаборЗаписейРегистра.Отбор.Регистратор.Значение;
// Рассчитать первичные записи
Если ТребуемыйВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Оклад Тогда
// Рассчитать вторичные записи
ИначеЕсли ТребуемыйВидРасчета =
ПланыВидовРасчета.ОсновныеНачисления.Премия Тогда
КонецЕсли;
КонецПроцедуры
Алгоритм расчета начислений будет различным при расчете
первичных (вид расчета – Оклад) и вторичных записей (вид расчета –
Премия), и каждая из его частей будет находиться в своей ветке
условия Если...
При расчете первичных записей нам понадобятся данные графика из
регистра расчета, поэтому добавим в первую ветку условия запроса
по виртуальной таблице регистра расчета РегистрРасчета.Начисления.ДанныеГрафика (листинг 18.4).
Листинг 18.4. Изменение процедуры «РассчитатьНачисления»
Процедура РассчитатьНачисления(НаборЗаписейРегистра, ТребуемыйВидРасчета ,
СписокСотрудников) Экспорт
Регистратор = НаборЗаписейРегистра.Отбор.Регистратор.Значение;
// Рассчитать первичные записи
Если ТребуемыйВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Оклад Тогда
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| НачисленияДанныеГрафика.ЗначениеПериодДействия КАК Норма, |
НачисленияДанныеГрафика.ЗначениеФактическийПериодДействия
| КАК Факт,
| НачисленияДанныеГрафика.НомерСтроки КАК НомерСтроки
|ИЗ
| РегистрРасчета.Начисления.ДанныеГрафика(Регистратор =
| &Регистратор И
| ВидРасчета = &ВидРасчета И Сотрудник В
(&СписокСотрудников)) | КАК НачисленияДанныеГрафика";
Запрос.УстановитьПараметр("Регистратор", Регистратор);
Запрос.УстановитьПараметр("ВидРасчета", ТребуемыйВидРасчета);
Запрос.УстановитьПараметр("СписокСотрудников", СписокСотрудников);
ВыборкаРезультата = Запрос.Выполнить().Выбрать();
// Рассчитать вторичные записи
ИначеЕсли ТребуемыйВидРасчета =
ПланыВидовРасчета.ОсновныеНачисления.Премия Тогда
КонецЕсли;
КонецПроцедуры
В этом запросе мы выбираем из виртуальной таблицы данных
графика регистра расчета значение графика для периода действия и
для фактического периода действия. При задании параметров
виртуальной таблицы мы ограничиваем выборку регистратором,
нужным нам видом расчета и списком сотрудников, по которым
нужно получить значения графика.
Теперь добавим обход переданного в процедуру набора записей и
расчет записей, для которых получены значения графика (листинг
18.5).
Листинг 18.5. Добавление обхода набора записей
и расчета первичных записей
Процедура РассчитатьНачисления(НаборЗаписейРегистра, ТребуемыйВидРасчета ,
СписокСотрудников) Экспорт
Регистратор = НаборЗаписейРегистра.Отбор.Регистратор.Значение;
// Рассчитать первичные записи
Если ТребуемыйВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Оклад Тогда …
ВыборкаРезультата = Запрос.Выполнить().Выбрать();
Для Каждого ЗаписьРегистра Из НаборЗаписейРегистра Цикл
СтруктураНомер = Новый Структура("НомерСтроки");
СтруктураНомер.НомерСтроки = ЗаписьРегистра.НомерСтроки;
ВыборкаРезультата.Сбросить();
Если ВыборкаРезультата.НайтиСледующий(СтруктураНомер) Тогда
Если ВыборкаРезультата.Норма = 0 Тогда Сообщение
= Новый СообщениеПользователю;
Сообщение.Текст = "Вид расчета: Оклад –
Нет рабочих дней в заданном периоде";
Сообщение.Сообщить();
ЗаписьРегистра.Результат = 0;
Иначе
// Рассчитать оклад по фактическому периоду и исходным
данным ЗаписьРегистра.Результат =
(ЗаписьРегистра.ИсходныеДанные
/ВыборкаРезультата.Норма) * ВыборкаРезультата.Факт;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Выполнен расчет " + ЗаписьРегистра.Регистратор
+ " – " + ЗаписьРегистра.ВидРасчета + " – "
+ ЗаписьРегистра.Сотрудник;
Сообщение.Сообщить();
КонецЕсли;
КонецЕсли;
КонецЦикла;
// Рассчитать вторичные записи
ИначеЕсли ТребуемыйВидРасчета =
ПланыВидовРасчета.ОсновныеНачисления.Премия Тогда
КонецЕсли;
КонецПроцедуры
Для каждой записи из набора записей регистра расчета мы получаем
номер строки, идентифицирующий начисление для конкретного
сотрудника, и по этому номеру ищем соответствующую запись в
выборке из результата запроса.
Если в результате запроса есть запись с таким номером строки, мы
рассчитываем результат записи регистра расчета. То есть мы
получаем начисление по окладу для каждого сотрудника как
результат от деления начисленной суммы (поле регистра
ИсходныеДанные) на количество рабочих дней в месяце (Норма) и
умножения на факти-чески отработанные рабочие дни (Факт).
Добавим текст запроса во вторую ветку условия Если… с той лишь
разницей, что теперь мы будем получать значения базы, используя
виртуальную таблицу регистра расчета РегистрРасчета.Начисления.
БазаНачисления (листинг 18.6).
Листинг 18.6. Добавление текста запроса во вторую ветку условия
Процедура РассчитатьНачисления(НаборЗаписейРегистра, ТребуемыйВидРасчета ,
СписокСотрудников) Экспорт
Регистратор = НаборЗаписейРегистра.Отбор.Регистратор.Значение;
// Рассчитать первичные записи
Если ТребуемыйВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Оклад Тогда …
// Рассчитать вторичные записи
ИначеЕсли ТребуемыйВидРасчета =
ПланыВидовРасчета.ОсновныеНачисления.Премия Тогда
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| НачисленияБазаНачисления.РезультатБаза КАК База,
| НачисленияБазаНачисления.НомерСтроки КАК НомерСтроки
|ИЗ
| РегистрРасчета.Начисления.БазаНачисления(&ИзмеренияОсновного,
| &ИзмеренияБазового, , Регистратор =
| &Регистратор И ВидРасчета = &ВидРасчета И
| Сотрудник В (&СписокСотрудников))
| КАК НачисленияБазаНачисления";
Измер = Новый Массив(1);
Измер[0] = "Сотрудник";
Запрос.УстановитьПараметр("ИзмеренияОсновного", Измер);
Запрос.УстановитьПараметр("ИзмеренияБазового", Измер);
Запрос.УстановитьПараметр("Регистратор", Регистратор);
Запрос.УстановитьПараметр("ВидРасчета", ТребуемыйВидРасчета);
Запрос.УстановитьПараметр("СписокСотрудников", СписокСотрудников);
ВыборкаРезультата = Запрос.Выполнить().Выбрать();
КонецЕсли;
КонецПроцедуры
В параметрах виртуальной таблицы запроса мы кроме привычных
для нас регистратора, вида расчета и списка сотрудников задаем еще
измерения основного и базового регистров. В нашем случае это будет
один и тот же регистр Начисления, а нужное нам измерение –
Сотрудник.
В заключение осталось добавить во второе условие Если… обход
набора записей регистра расчета и вычисление результата вторичных
записей (листинг 18.7).
Листинг 18.7. Добавление обхода набора записей регистра
и вычисления результата вторичных записей
Процедура РассчитатьНачисления(НаборЗаписейРегистра, ТребуемыйВидРасчета,
СписокСотрудников) Экспорт
Регистратор = НаборЗаписейРегистра.Отбор.Регистратор.Значение;
// Рассчитать первичные записи
Если ТребуемыйВидРасчета =
ПланыВидовРасчета.ОсновныеНачисления.Оклад Тогда …
// Рассчитать вторичные записи
ИначеЕсли ТребуемыйВидРасчета =
ПланыВидовРасчета.ОсновныеНачисления.Премия Тогда …
ВыборкаРезультата = Запрос.Выполнить().Выбрать();
Для Каждого ЗаписьРегистра Из НаборЗаписейРегистра Цикл
СтруктураНомер = Новый Структура("НомерСтроки");
СтруктураНомер.НомерСтроки = ЗаписьРегистра.НомерСтроки;
ВыборкаРезультата.Сбросить();
Если ВыборкаРезультата.НайтиСледующий(СтруктураНомер) Тогда
ЗаписьРегистра.Результат = ВыборкаРезультата.База * (10 / 100);
Сообщение = Новый СообщениеПользователю; Сообщение.Текст
= "Выполнен расчет "
+ ЗаписьРегистра.Регистратор + " – "
+ ЗаписьРегистра.ВидРасчета + " – "
+ ЗаписьРегистра.Сотрудник;
Сообщение.Сообщить();
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Сумму начисленной премии мы рассчитываем как 10 % от рассчитанной оплаты по окладу.
В режиме «1С:Предприятие»
Запустим «1С:Предприятие» в режиме отладки и проверим правильность работы процедуры расчета.
Отменим проведение документа Начисления сотрудникам № 3 (Еще >
Отменить проведение) и перепроведем документы Начис-ления
сотрудникам № 1 и № 2. Регистр расчета Начисления должен
выглядеть следующим образом (рис. 18.14, 18.15).
Рис. 18.14. Записи регистра «Начисления»
Рис. 18.15. Записи регистра «Начисления»
Мы видим, что всем сотрудникам произведены начисления по окладу
(поле Результат) за полный месяц в соответствии с исходными
данными (поле Исходные данные).
Сотрудникам Гусакову и Деловому начислена премия в размере 10 %
от суммы начисления по окладу.
Проведем документ Начисление сотрудникам № 3, а затем № 1 и № 2.
При этом отчет Перерасчет должен быть пуст.
Состояние регистра изменится следующим образом (рис. 18.16,
18.17).
Рис. 18.16. Записи регистра «Начисления»
Рис. 18.17. Записи регистра «Начисления»
В результате невыхода Гусакова на работу сумма оплаты по окладу
будет уменьшена, и соответствующим образом уменьшится начисленная ему премия.
Отчет о начислениях сотрудникам
Теперь мы посмотрим, каким образом можно использовать данные,
хранящиеся в регистре расчета, для получения в отчете итоговой
информации о начислениях сотрудникам (рис. 18.18).
Рис. 18.18. Результат отчета
В режиме «Конфигуратор»
Создадим в конфигураторе новый объект конфигурации Отчет.
Назовем его НачисленияСотрудникам. Создадим основную схему
компоновки данных отчета, добавим новый Набор данных – запрос,
откроем конструктор запроса.
Запрос для набора данных
Выберем таблицу регистра расчета Начисления (рис. 18.19).
Из нее выберем следующие поля:
 Сотрудник,
 ВидРасчета,
 ПериодДействияНачало,
 ПериодДействияКонец,
 Регистратор,
 Результат (рис. 18.20).
Рис. 18.19. Состав полей таблицы «Начисления»
Рис. 18.20. Выбранные поля
На закладке Объединения/Псевдонимы определим следующие псевдонимы полей ПериодДействияНачало и ПериодДействияКонец (рис.
18.21).
Рис. 18.21. Объединения/Псевдонимы
На этом создание запроса закончено, нажмем ОK.
Ресурсы
Перейдем на закладку Ресурсы и укажем, что должна быть рассчитана сумма по полю Результат.
Настройки
После этого перейдем на закладку Настройки и создадим структуру
отчета.
Добавим группировку по полю Сотрудник и в ней – подчиненную
группировку детальных записей.
В качестве полей, выводимых в отчет, выберем поля ВидРасчета,
Начало, Окончание, Регистратор и Результат.
В результате окно настроек отчета должно иметь вид (рис. 18.22).
Рис. 18.22. Структура и выбранные поля отчета
На закладке Сортировка укажем, что сортировка должна выполняться
по возрастанию значения поля Сотрудник и Регистратор (рис. 18.23).
Рис. 18.23. Настройка сортировки отчета
И в заключение на закладке Другие настройки зададим заголовок
отчета – Начисления сотрудникам.
На этом создание схемы компоновки данных закончено, закроем ее.
В окне редактирования объекта конфигурации Отчет НачисленияСотрудникам на закладке подсистемы укажем, что отчет будет вызываться из подсистем РасчетЗарплаты и Бухгалтерия.
В режиме «1С:Предприятие»
Запустим «1С:Предприятие» в режиме отладки.
В панели функций раздела Расчет зарплаты выполним команду
Отчеты > Начисления сотрудникам и сформируем отчет (рис. 18.24).
Рис. 18.24. Результат отчета
Перерасчет
Итак, в нашем алгоритме работы с данными расчета осталось одно
узкое место – контроль актуальности данных, содержащихся в
регистре расчета.
До сих пор мы с вами использовали служебный отчет Перерасчет для
того, чтобы определить, являются ли данные в регистре расчета актуальными (если отчет пуст), или же они требуют перерасчета.
Теперь мы с вами создадим специальную процедуру, которая будет
определять, требуется ли перерасчет данных регистра расчета, и, если
такая необходимость есть, выполнять перерасчет.
Поскольку единственным способом получения итоговой информации
о начислениях сотрудникам в нашей конфигурации является отчет
НачисленияСотрудникам, для вызова этой процедуры мы создадим
форму этого отчета и добавим в командную панель формы кнопку
Перерассчитать, по которой будет выполняться перерасчет данных
регистра.
В режиме «Конфигуратор»
Для этого в окне редактирования объекта конфигурации Отчет НачисленияСотрудникам перейдем на закладку Формы, нажмем кнопку
открытия и создадим основную форму отчета.
Затем в правом верхнем окне редактора форм перейдем на закладку
Команды и на закладке Команды формы создадим команду формы
Перерассчитать (рис. 18.25).
Теперь нужно установить Действие для этой команды.
Для этого нажмем кнопку открытия в строке Действие.
На запрос конфигуратора о типе обработчика команды ответим, что
мы хотим создать обработчик, выполняющийся на клиенте.
Рис. 18.25. Добавление команды формы
В модуле формы будет создан шаблон клиентской процедуры Перерассчитать(), в которую мы поместим вызов процедуры ПерерассчитатьНачисления() из общего модуля ПроведениеРасчетов (листинг
18.8).
Листинг 18.8. Текст обработчика команды «Перерассчитать»
&НаКлиенте
Процедура Перерассчитать(Команда)
ПроведениеРасчетов.ПерерассчитатьНачисления(ПредопределенноеЗначение(
"ПланВидовРасчета.ОсновныеНачисления.Оклад"));
ПроведениеРасчетов.ПерерассчитатьНачисления(ПредопределенноеЗначение(
"ПланВидовРасчета.ОсновныеНачисления.Премия"));
КонецПроцедуры
Саму процедуру перерасчета поместим в общем модуле ПроведениеРасчетов (листинг 18.9).
Листинг 18.9. Процедура перерасчета начислений
Процедура ПерерассчитатьНачисления(ТребуемыйВидРасчета) Экспорт
// Здесь следует выбрать из набора записей перерасчета записи в следующей
последовательности: // записи документа1 для сотрудников из списка,
// записи документа2 для сотрудников из списка и т.д.
Запрос = Новый Запрос(
"ВЫБРАТЬ
| НачисленияПерерасчет.ОбъектПерерасчета, |
НачисленияПерерасчет.Сотрудник
|ИЗ
| РегистрРасчета.Начисления.Перерасчет КАК НачисленияПерерасчет
|ГДЕ
| НачисленияПерерасчет.ВидРасчета = &ТребуемыйВидРасчета
|ИТОГИ ПО
| НачисленияПерерасчет.ОбъектПерерасчета");
Запрос.УстановитьПараметр("ТребуемыйВидРасчета", ТребуемыйВидРасчета);
СписокСотрудников = Новый СписокЗначений;
// Перебрать группировку по регистратору.
ВыборкаПоРегистратору = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса
.ПоГруппировкам);
Пока ВыборкаПоРегистратору.Следующий() Цикл
Регистратор = ВыборкаПоРегистратору.ОбъектПерерасчета;
// Перебрать группировку по сотрудникам для выбранного регистратора // и
создать список сотрудников.
ВыборкаПоСотрудникам = ВыборкаПоРегистратору.Выбрать();
СписокСотрудников.Очистить();
Пока ВыборкаПоСотрудникам.Следующий() Цикл
СписокСотрудников.Добавить(ВыборкаПоСотрудникам.Сотрудник);
КонецЦикла;
// Получить набор записей регистра расчета для выбранного регистратора.
НаборЗаписей = РегистрыРасчета.Начисления.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Значение = Регистратор;
НаборЗаписей.Прочитать();
РассчитатьНачисления(НаборЗаписей, ТребуемыйВидРасчета, СписокСотрудников);
НаборЗаписей.Записать( , Истина);
// Очистить перерассчитанные записи в перерасчете.
НаборЗаписейПерерасчета = РегистрыРасчета.Начисления.Перерасчеты
.Перерасчет.СоздатьНаборЗаписей();
НаборЗаписейПерерасчета.Отбор.ОбъектПерерасчета.Значение = Регистратор;
НаборЗаписейПерерасчета.Записать();
КонецЦикла;
КонецПроцедуры
В самом начале процедуры мы запросом выбираем данные о записях
перерасчетов, содержащие переданный вид расчета и сгруппированные по объекту перерасчета.
Далее при обходе результата запроса мы формируем для каждого
объекта перерасчета список сотрудников, читаем соответствующие
записи регистра расчета и вызываем процедуру РассчитатьНачисления(), которая использовалась нами при расчете записей документа
НачисленияСотрудникам.
После того как расчет записей выполнен, мы записываем набор
записей без формирования записей перерасчета и очищаем записи
перерасчета по тому объекту перерасчета, который только что обработали.
Вернемся в форму отчета НачислениеСотрудникам.
Итак, мы указали для команды Перерассчитать действие, то есть
процедуру для ее выполнения. Но чтобы можно было воспользоваться этой командой, нужно создать в форме кнопку и связать ее с
этой командой (в строке ИмяКоманды).
Проще всего это сделать перетаскиванием команды из окна Команды
формы в окно элементов формы.
Перетащим мышью команду Перерассчитать в группу элементов
формы КоманднаяПанель.
При этом в форме появится кнопка Перерассчитать, а связь кнопки с
командой будет установлена автоматически (рис. 18.26).
Рис. 18.26. Добавление кнопки в форму
В режиме «1С:Предприятие»
Запустим «1С:Предприятие» и проверим, как выполняется перерасчет
записей регистра расчета.
Отменим проведение всех документов Начисления сотрудникам и
проведем документ Начисления сотрудникам № 1 и затем № 2.
Сформируем отчет Начисления сотрудникам (рис. 18.27).
Теперь откроем документ Начисления сотрудникам № 1, изменим
оклад Гусакова на 10000 и проведем документ.
Рис. 18.27. Отчет «Начисления сотрудникам»
В отчете Начисления сотрудникам нажмем кнопку Перерассчитать.
Будет выполнен перерасчет начисления премии Гусакову и Деловому
(рис. 18.28).
Рис. 18.28. Окно служебных сообщений
Чтобы увидеть в отчете актуальные данные, нажмем кнопку Сформировать.
Результат работы отчета будет содержать новые значения премии
Гусакова (рис. 18.29).
Рис. 18.29. Отчет «Начисления сотрудникам»
И, наконец, проведем документ Начисления сотрудникам № 3 и
нажмем Перерассчитать в отчете Начисления сотрудникам.
Снова будет произведен перерасчет оклада и премии Гусакова (рис.
18.30).
Рис. 18.30. Окно служебных сообщений
Затем нажмем кнопку Сформировать. Данные отчета будут
содержать актуальные значения начисления оклада и премии (рис.
18.31).
Рис. 18.31. Отчет «Начисления сотрудникам»
Диаграмма Ганта
В конце этой главы мы совместим приятное с полезным и создадим с
вами отчет, который в графическом виде будет показывать нам
фактический период действия записей расчета.
Помимо наглядной демонстрации работы механизма вытеснения
записей по периоду действия этот отчет позволит нам познакомиться
с элементом формы, позволяющим создавать диаграммы Ганта.
Диаграмма Ганта представляет собой диаграмму интервалов на
шкале времени (рис. 18.32) и отражает использование объектами
(точками) ресурсов (серий).
Чтобы проще было представить себе составные части диаграммы
Ганта, изучим диаграмму, которая должна получиться в результате
работы создаваемого нами отчета.
Как мы уже говорили, эта диаграмма будет отображать для каждого
сотрудника фактический период действия записи по каждому из
видов расчета, имеющих место для этого сотрудника.
Рис. 18.32. Пример диаграммы Ганта
Итак, диаграмма Ганта представляет собой совокупность точек, серий
и значений для каждой пары точка-серия.
В нашем случае точками диаграммы являются сотрудники, а сериями
– виды расчетов. Таким образом, для каждого сотрудника существует
некоторое значение диаграммы по каждой из серий, то есть по
каждому из видов расчета.
Значение диаграммы Ганта представляет собой специальный объект,
который автоматически формируется системой на основании того,
какие точки и какие серии определены для данной диаграммы.
Этот объект является совокупностью (коллекцией) интервалов, то
есть может содержать не один, а несколько интервалов, которые
соответствуют паре серия-точка (создаваемый по умолчанию объект
ЗначениеДиаграммыГанта не содержит ни одного интервала). Разработчик может получить значение диаграммы, указав интересующую
его точку и серию, и затем добавить в коллекцию необходимое количество интервалов.
Все интервалы всех значений диаграммы располагаются с привязкой
к единой оси времени, что дает возможность видеть их взаимное
расположение.
Теперь коротко объясним последовательность наших дальнейших
действий.
В качестве исходных данных для построения такой диаграммы мы
возьмем данные регистра расчета Начисления. Каждая запись этого
регистра уже содержит все необходимое для построения диаграммы:
сотрудника, вид расчета, начало и конец интервала.
Нам останется только средствами встроенного языка разместить все
это в диаграмме.
Итак, приступим.
В режиме «Конфигуратор»
Создадим новый объект конфигурации Отчет и назовем его ДиаграммаНачислений.
Для этого отчета мы не будем создавать схему компоновки данных, а
создадим основную форму отчета и обеспечим формирование и
настройку диаграммы Ганта с помощью кода на встроенном языке. В
окне редактирования объекта конфигурации Отчет ДиаграммаНачислений перейдем на закладку Формы, нажмем кнопку открытия
и создадим основную форму отчета.
В правом верхнем окне редактора форм на закладке Реквизиты
находятся реквизиты формы. Мы видим здесь основной реквизит
формы Отчет, который был создан автоматически при создании
формы.
Нажмем кнопку Добавить и добавим новый реквизит формы. Назовем
его ДиаграммаГанта и выберем его тип ДиаграммаГанта (рис. 18.33).
Теперь перетащим новый реквизит в окно элементов формы, которое
пока пусто.
Ответим утвердительно на вопрос о переносе колонок таблицы
диаграммы Ганта. В результате в окне элементов формы будет
создано новое поле для отображения диаграммы, раскрыв которое мы
увидим ее таблицу.
Выделим эту таблицу в окне элементов формы и уберем отметку со
свойства Видимость (рис. 18.34). А также выделим сам элемент
формы ДиаграммаГанта и установим свойство ПоложениеЗаго-ловка
в значение Нет (так как отображать заголовок поля диаграммы не
нужно).
Рис. 18.33. Добавление реквизита формы
В результате форма отчета примет следующий вид (рис. 18.34).
Рис. 18.34. Добавление диаграммы Ганта в форму
Итак, мы скрыли отображение таблицы у диаграммы Ганта, но нам
нужно установить отображение текста точек в области построения
диаграммы. Для этого выделим реквизит ДиаграммаГанта в окне
реквизитов формы и нажмем Открыть в строке Настройка в палитре
свойств этого реквизита (рис. 18.35).
Рис. 18.35. Настройка реквизита «Диаграмма Ганта»
Затем, щелкнув мышью в области построения диаграммы, выделим
эту область и установим свойство ОтображатьТекстТочек в значение
Отображать (рис. 18.36).
Затем на закладке Команды в верхнем правом углу редактора форм
создадим команду формы Сформировать (рис. 18.37).
Теперь нужно установить Действие для этой команды.
Для этого нажмем кнопку открытия в строке Действие.
Рис. 18.36. Свойства области построения диаграммы
Рис. 18.37. Добавление команды формы
На запрос конфигуратора о типе обработчика команды ответим, что
мы хотим создать клиентский обработчик команды формы с вызовом
из него процедуры, выполняющейся на сервере без контекста формы
(рис. 18.38).
Рис. 18.38. Выбор типа обработчика команды формы
В модуле формы будут созданы шаблоны двух процедур: клиентской
процедуры Сформировать() и серверной внеконтекстной процедуры
СформироватьНаСервере(), которая вызывается из процедуры Сформировать().
Мы не будем сейчас подробно рассматривать, что такое серверная
внеконтекстная процедура. Отметим только, что внеконтекстная
процедура выполняется на сервере значительно быстрее за счет того,
что на сервер с клиента не передается весь контекст формы.
Однако нам нужно передать в процедуру СформироватьНаСервере() в
качестве параметра ссылку на реквизит формы ДиаграммаГанта,
чтобы на сервере заполнить его данными. Поэтому изменим текст
модуля следующим образом (листинг 18.10).
Листинг 18.10. Текст обработчика команды «Сформировать»
&НаКлиенте
Процедура Сформировать(Команда)
СформироватьНаСервере(ДиаграммаГанта);
КонецПроцедуры
&НаСервереБезКонтекста
Процедура СформироватьНаСервере(Диаграмма) //
Вставить содержимое обработчика.
КонецПроцедуры
В процедуру СформироватьНаСервере() мы вставим заготовку
запроса (листинг 18.11).
Листинг 18.11. Процедура «СформироватьНаСервере()»
&НаСервереБезКонтекста
Процедура СформироватьНаСервере(Диаграмма)
Запрос = Новый Запрос;
Запрос.Текст = ;
КонецПроцедуры
Установим курсор перед точкой с запятой, вызовем контекстное
меню, откроем конструктор запроса и создадим новый запрос.
Выберем виртуальную таблицу регистра расчета Начисления.ФактическийПериодДействия.
Из этой таблицы выберем следующие поля (рис. 18.39):
 Сотрудник,
 ВидРасчета,
 ПериодДействияНачало,
 ПериодДействияКонец,
 Результат,
 Регистратор,
 Регистратор.Представление.
Рис. 18.39. Выбранные поля
Все, запрос готов.
Теперь нажмем OK и после текста запроса добавим в процедуру
следующий текст (листинг 18.12).
Листинг 18.12. Процедура «СформироватьНаСервере()»
&НаСервереБезКонтекста
Процедура СформироватьНаСервере(Диаграмма)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| НачисленияФактическийПериодДействия.Сотрудник КАК Сотрудник,
| НачисленияФактическийПериодДействия.ВидРасчета КАК ВидРасчета, |
НачисленияФактическийПериодДействия.ПериодДействияНачало КАК |
ПериодДействияНачало,
| НачисленияФактическийПериодДействия.ПериодДействияКонец КАК |
ПериодДействияКонец,
| НачисленияФактическийПериодДействия.Результат КАК Результат,
| НачисленияФактическийПериодДействия.Регистратор КАК Регистратор,
| НачисленияФактическийПериодДействия.Регистратор.Представление КАК |
РегистраторПредставление
|ИЗ
| РегистрРасчета.Начисления.ФактическийПериодДействия КАК
| НачисленияФактическийПериодДействия";
ВыборкаРезультата = Запрос.Выполнить().Выбрать();
// Запретить обновление диаграммы.
Диаграмма.Обновление = Ложь;
Диаграмма.Очистить();
Диаграмма.ОтображатьЗаголовок = Ложь;
// Заполнить диаграмму.
Пока ВыборкаРезультата.Следующий() Цикл
// Получить серию, точку и значение для них.
ТекущаяСерия = Диаграмма.УстановитьСерию(ВыборкаРезультата.ВидРасчета);
ТекущаяТочка = Диаграмма.УстановитьТочку(ВыборкаРезультата.Сотрудник);
ТекущееЗначение = Диаграмма.ПолучитьЗначение(ТекущаяТочка, ТекущаяСерия);
// Создать нужные нам интервалы в значении.
ТекущийИнтервал = ТекущееЗначение.Добавить();
ТекущийИнтервал.Начало = ВыборкаРезультата.ПериодДействияНачало;
ТекущийИнтервал.Конец = ВыборкаРезультата.ПериодДействияКонец;
ТекущийИнтервал.Текст = ВыборкаРезультата.РегистраторПредставление;
ТекущийИнтервал.Расшифровка = ВыборкаРезультата.Регистратор;
КонецЦикла;
// Раскрасить серии своими цветами.
Для Каждого Серия из Диаграмма.Серии Цикл
Если Серия.Значение = ПланыВидовРасчета.ОсновныеНачисления.Оклад Тогда
Серия.Цвет = WEBЦвета.Желтый;
ИначеЕсли Серия.Значение = ПланыВидовРасчета.ОсновныеНачисления.Премия
Тогда
Серия.Цвет = WEBЦвета.Зеленый;
ИначеЕсли Серия.Значение = ПланыВидовРасчета.ОсновныеНачисления.Невыход
Тогда
Серия.Цвет = WEBЦвета.Красный;
КонецЕсли;
КонецЦикла;
// Разрешить обновление диаграммы.
Диаграмма.Обновление = Истина;
КонецПроцедуры
Сначала мы запрещаем обновление диаграммы на то время, пока мы
будем заполнять ее данными. Это нужно для того, чтобы в процессе
заполнения не выполнялись пересчеты при каждом изменении
данных диаграммы. После окончания заполнения диаграммы мы
разрешим обновление, и все пересчеты будут выполнены один раз.
Затем в цикле по выборке запроса мы заполняем диаграмму.
Сначала, используя методы УстановитьСерию() и Установить Точку(),
мы получаем либо существующие, либо новые точку и серию. Точки
и серии однозначно идентифицируются своими значениями, в
качестве которых мы используем сотрудника и вид расчета из
результата запроса.
После того как точка и серия получены, с помощью метода ПолучитьЗначение() мы получаем соответствующее им значение
диаграммы.
Затем мы добавляем в значение диаграммы новый интервал, задаем
его начало и конец, задаем текст интервала, который будет показываться во всплывающей подсказке, и задаем расшифровку интервала,
которая будет выполняться при двойном щелчке мышью на этом
интервале.
После того как все значения диаграммы сформированы, мы раскрашиваем серии своими цветами. Серии диаграммы представляют
собой коллекцию значений, которую мы перебираем при помощи
конструкции Для Каждого … Цикл.
Теперь вернемся в форму и добавим в нее кнопку для выполнения
команды Сформировать.
Для этого перетащим мышью команду Сформировать из окна
Команды формы в окно элементов формы (рис. 18.40).
Рис. 18.40. Добавление кнопки в форму
В заключение в окне редактирования объекта конфигурации Отчет
ДиаграммаНачислений на закладке подсистемы укажем, что отчет
будет вызываться из подсистемы РасчетЗарплаты.
В режиме «1С:Предприятие»
Запустим «1С:Предприятие» в режиме отладки и посмотрим на
результат работы отчета (рис. 18.41).
А теперь посмотрим, как выглядит механизм вытеснения по периоду
действия на конкретном примере.
Откроем документ Начисления сотрудникам № 3 и вместо одного
прогула с 1 по 10 число зададим Гусакову два прогула: с 3 по 7 число
и с 12 по 15 число.
Проведем документ и снова нажмем Сформировать в нашем отчете
(рис. 18.42).
Рис. 18.41. Отчет «Диаграмма начислений»
Рис. 18.42. Отчет «Диаграмма начислений»
Теперь вы наглядно видите, как записи вида расчета Невыход вытеснили
по периоду действия запись расчета Оклад, изменив ее фактический
период действия.
Следует отметить, что существует также возможность интерактивной
настройки параметров диаграммы Ганта в режиме 1С:Предприятие,
доступная через пункт контекстного меню Настройка… Также настройку
параметров диаграммы, таких как Отображать заголовок, Отображать
легенду, Прозрачный фон и т.п., можно выполнить в конфигураторе, в
редакторе формы отчета Диаграмма начислений. Для этого в панели
свойств реквизита, содержащего диаграмму, нужно выполнить команду
Настройка > Открыть.ЗАНЯТИЕ 21
Список пользователей
и их роли
После того как созданы все основные объекты конфигурации, можно
приступить к определению ролей пользователей. Администрирование
списка пользователей «1С:Предприятия» и назначение им ролей в
соответствии с их служебными обязанностями – очень важные
моменты для организации интерфейса прикладного решения в целом
и разграничения прав и действий его отдельных пользователей.
Этому вопросу и будет посвящено данное занятие.
До сих пор мы с вами имели полный доступ ко всем разделам приложения и ко всем объектам конфигурации и командам, используемым
в этих разделах. Однако при реальной работе пользователей одной из
главных возможностей, которую должно обеспечивать прикладное
решение, является разграничение прав доступа пользователей к той
или иной информации, хранящейся в информационной базе.
Например, руководитель должен, очевидно, иметь доступ ко всей
информации, которая содержится в базе данных, а вот кладовщик,
напротив, должен иметь доступ только к информации, касающейся
движения товаров на складах, и не иметь возможности
просматривать бухгалтерскую или кадровую информацию.
Кроме этого, должна существовать возможность ограничить пользователей в выполнении тех или иных действий с объектами базы
данных. Например, кладовщик может создавать и изменять
приходные накладные, поскольку он отвечает за учет матери-алов на
предприятии. Мастеру может понадобиться просматри-вать
приходные накладные для того, чтобы знать, какие материалы и
когда были получены. Однако мастер не должен иметь возможности
вносить какие-либо изменения в приходные накладные.
Что такое роль
Для описания подобных разрешений используются объекты конфигурации Роль. С помощью такого объекта разработчик получает
возмож-ность описать набор прав на выполнение тех или иных
действий над каждым объектом базы данных и над всей
конфигурацией в целом.
Как правило, роли создаются отдельно для каждого вида деятельности, и каждому пользователю системы ставится в соответствие
одна или несколько ролей.
Если пользователю поставлено в соответствие несколько ролей,
предо-ставление доступа будет осуществляться по следующему
алгоритму:
 если хотя бы в одной роли есть разрешение, то доступ будет
открыт;  если во всех ролях разрешение отсутствует, то доступ
будет закрыт.
Создание ролей
В режиме «Конфигуратор»
При создании ролей исходят, как правило, из того, какие полномочия
требуются различным группам пользователей на доступ к информации. Для этого мы воспользуемся подсистемами, которые значительно облегчат нашу задачу.
Администратор
Первая роль, которую мы создадим, будет Администратор. Она
должна включать в себя полные права на работу с данными информационной базы.
Раскроем ветвь Общие дерева объектов конфигурации. Выделим
строку Роли и добавим новый объект конфигурации Роль. Зададим
его имя – Администратор (рис. 22.1).
Рис. 22.1. Создание роли
Откроется окно редактирования прав этой роли (рис. 22.2).
Рис. 22.2. Окно редактирования прав для роли «Администратор»
Слева, в списке объектов, перечислены все объекты и виды объектов
конфигурации, а справа, в окне прав, – доступные права для выбранного объекта или видов объектов конфигурации.
Администратор должен иметь права на все объекты и все виды
объектов. Для этого выполним команду Действия > Установить все
права в командной панели окна.
После этого все права для всех объектов будут помечены.
Однако можно поставить или снять отметку для прав конкретного
объекта конфигурации, пользуясь кнопками Отметить все элементы
и Снять отметку со всех элементов, расположенными над окном прав.
Теперь единственное, что следует сделать, – снять разрешение на
интерактивное удаление для всех объектов. Это необходимо для того,
чтобы администратор случайно не мог удалить какой-либо объект
базы данных. Для этого пройдемся по всем видам объектов конфигурации (Справочники, Документы и т.д.) и снимем отметку с команды
Интерактивное удаление. Заметьте, что одновременно с отключением
права на интерактивное удаление объектов снимается также отметка
с права Интерактивное удаление предопределенных (см. рис. 22.2).
Для того чтобы наш Администратор мог работать с объектами,
которые мы будем создавать после расстановки прав, зададим для
него параметр Устанавливать права для новых объектов (см. рис.
22.2).
На этом создание роли Администратор закончено.
Директор
Следующей ролью, которую мы создадим, будет роль Директор.
Создадим новый объект конфигурации Роль с именем Директор.
Убедимся, что право Вывод для всей конфигурации у этой роли установлено.
Теперь нам останется лишь пройти по видам объектов конфигурации
и установить для них право Просмотр (права Чтение и Использование
при этом установятся автоматически).
Затем раскроем ветвь Общие, выделим ветвь Подсистемы и отметим
право Просмотр у всех подсистем. Тем самым мы предоставим
директору возможность просматривать все данные информационной
базы, а позднее с помощью установки видимости команд по ролям
мы исключим из его интерфейса все действия, которые по логике
нашей конфигурации не относятся к прикладной ее части (рис. 22.3).
Рис. 22.3. Окно редактирования прав для роли «Директор»
Вторая роль нашей конфигурации готова.
Мастер
Следующая роль, которую мы создадим, будет роль Мастер. Снова
добавим новый объект конфигурации Роль с именем Мастер.
Выполним команду Действия > Установить по подсистемам… и
выберем подсистемы УчетМатериалов и ОказаниеУслуг. Нажмем
Установить.
В результате будут установлены все права на объекты конфигурации,
относящиеся к данным подсистемам.
Если теперь установить фильтр объектов по подсистемам УчетМатериалов и ОказаниеУслуг, то можно при необходимости внести
уточнения в установленные права (рис. 22.4).
Рис. 22.4. Установка фильтра по подсистеме
В частности, для справочника Сотрудники мы запретим права Добавление, Изменение и Удаление.
Обратите внимание, что при запрете права Добавление исчезла
отметка и у права Интерактивное добавление, так как оно является
«уточнением» права Добавление. Точно так же уточненные права
запрещаются и при отмене прав на изменение и удаление.
Кроме этого, мы снова снимем разрешения на интерактивное
удаление для всех объектов базы данных. Для этого пройдем по всем
видам объектов конфигурации и снимем у всех право Интерактивное
удаление.
Затем снимем фильтр и установим все права, кроме интерактивного
удаления для следующих объектов конфигурации:
 справочник ВариантыНоменклатуры,
 справочник ДополнительныеСвойстваНоменклатуры,
 план видов характеристик СвойстваНоменклатуры,
 регистр сведений ЗначенияСвойствНоменклатуры.
Эти объекты мы не привязывали ни к каким подсистемам, но они
будут нужны для работы с характеристиками номенклатуры.
В заключение раскроем ветвь Общие, выделим ветвь Подсистемы и
отметим право Просмотр у подсистемы Предприятие. Тем самым мы
предоставим доступ к нормативно-справочной информации, которая
будет находиться в этой подсистеме. А ненужную мастерам
функциональность скроем с помощью видимости команд по ролям.
Роль Мастер готова.
Расчетчик
В заключение нам с вами осталось создать две роли: Бухгалтер и
Расчетчик.
Мы разделим права по расчету зарплаты и по ведению
бухгалтерского учета.
Дело в том, что в ООО «На все руки мастер» есть бухгалтер и
помощник бухгалтера. Помощник бухгалтера занят в основном
расчетом зарплаты, но иногда это делает и главный бухгалтер.
Поэтому главному бухгалтеру необходимо будет назначить обе роли,
в то время как помощнику – только роль Расчетчик.
Создадим новый объект конфигурации Роль с именем Расчетчик.
В окне редактирования прав установим их по подсистеме РасчетЗарплаты (и не забудем запретить интерактивное удаление). А
также установим право Просмотр для объекта конфигурации: Регистр
накопления Продажи и справочника Клиенты.
В заключение установим право Просмотр у подсистемы Предприятие.
Роль Расчетчик готова.
Бухгалтер
В заключение создадим объект конфигурации Роль с именем
Бухгалтер. В окне редактирования прав установим их по подсистеме
Бухгалтерия.
После этого отфильтруем список объектов по этой подсистеме и для
справочника Номенклатура запретим добавление, изменение и
удаление.
Также запретим интерактивное удаление для всех объектов.
Затем снимем фильтр и установим все права, кроме интерактивного
удаления для объекта конфигурации Справочник Субконто.
А также установим право Просмотр для следующих объектов конфигурации:
 Справочник Склады,
 Справочник ВариантыНоменклатуры,
 Справочник ДополнительныеСвойстваНоменклатуры,
 План видов характеристик СвойстваНоменклатуры,
 Регистр сведений ЗначенияСвойствНоменклатуры.
В заключение установим право Просмотр у подсистемы Предприятие.
Права на запуск клиентских приложений
В заключение убедимся, что у каждой роли есть права на запуск
клиентского приложения (тонкого клиента, веб-клиента и
мобильного клиента).
Для этого воспользуемся другим, более удобным инструментом –
редактором Все роли. В дереве объектов конфигурации выделим
ветку Роли и в контекстном меню выполним команду Все роли. Мы
видим, что права Тонкий клиент, Веб-клиент и Мобильный клиент
включены для всех ролей (рис. 22.5).
Администратор также имеет возможность подключаться и с помощью
других клиентских приложений.
Список прав для каждой роли можно получить, выполнив в окне
редактирования прав команду Действия > Вывести список… (рис.
22.6).
Рис. 22.5. Окно редактора «Все роли»
Рис. 22.6. Список прав для роли «Бухгалтер»
Аналогичный список, но только для всех ролей, которые есть в
конфигурации, можно получить из редактора Все роли.
Добавление новых пользователей
Для того чтобы иметь возможность отличать друг от друга пользователей, работающих с информационной базой, в системе
«1С:Предприятие» существует список пользователей.
Можно создавать и удалять пользователей системы, назначать им
роли и т.д.
В режиме «Конфигуратор»
Прежде чем мы приступим к созданию пользователей, необходимо
выполнить обновление конфигурации базы данных (Конфигурация >
Обновить конфигурацию базы данных (F7) ), поскольку пользователю можно поставить в соответствие только те роли, которые существуют в конфигурации базы данных.
После того как обновление произведено, выполним команду главного
меню Администрирование > Пользователи.
Откроется список пользователей системы. Пока что он пуст, поэтому
добавим нового пользователя (Действия > Добавить) или нажмем
кнопку Добавить в командной панели окна (рис. 22.7).
Рис. 22.7. Список пользователей
Откроется окно редактирования пользователя (рис. 22.8).
Рис. 22.8. Окно редактирования пользователя
ВНИМАНИЕ!
Если вы используете учебную версию платформы «1С:Предприя-тие
8.3», то возможность задания паролей пользователей и аутентификация операционной системы будут недоступны. Это ограничения
учебной версии.
Имя пользователя – это идентификатор, который будет появ-ляться в
окне выбора пользователей при запуске системы в режиме
1С:Предприятие.
Полное имя – строка, которая может быть использована внутри
конфигурации при выводе различной справочной информации.
Хорошим стилем администрирования считается указание в качестве
полного имени фамилии, имени и отчества пользователя (без сокращений).
Следующие две области окна посвящены способам аутентификации
пользователя.
Аутентификация средствами «1С:Предприятия» подразумевает, что
после запуска системы пользователю будет предложено выбрать имя
одного из пользователей системы и ввести пароль. Если введенный
пароль соответствует сохраненному в системе для этого идентификатора пользователя, система открывается с правами, которые указаны
для этого пользователя. При этом он сможет поменять пароль, если
флажок Пользователю запрещено изменять пароль не установлен.
Аутентификация операционной системы подразумевает, что при
запуске системы «1С:Предприятие» от пользователя не требуется
никакой дополнительной информации. Система «1С:Предприятие»
определяет, под каким пользователем запущена операционная
система, и затем обращается к своему списку пользователей. Если
она находит в нем пользователя, которому поставлен в соответствие
текущий пользователь операционной системы, информационная база
открывается с правами, указанными для этого пользователя.
Приступим к созданию пользователей.
Зададим имя пользователя Администратор, полное имя тоже Администратор. Перейдем на закладку Прочие. Отметим роль Администратор
и язык конфигурации выберем Русский (рис. 22.9).
Рис. 22.9. Закладка «Прочие» окна редактирования пользователя
Нажмем ОК.
После этого создадим остальных пользователей системы (рис. 22.10).
Для всех них мы будем использовать аутентификацию
«1С:Предприятия» и русский язык.
ПРИМЕЧАНИЕ
Если некоторые колонки, например Роли, не видны в списке пользователей, можно настроить список, выполнив команду Действия >
Настройка списка…, и добавить нужные колонки.
Рис. 22.10. Список пользователей системы
Обратите внимание, что главному бухгалтеру Назаровой постав-лены
в соответствие две роли: Расчетчик и Бухгалтер, поскольку она
должна иметь возможность не только вести бухгалтерский учет, но и
рассчитывать зарплату.
Список пользователей, зарегистрированных в системе, можно
получить, выполнив команду Действия > Вывести список…
Теперь, когда созданы пользователи, при каждом входе в конфигуратор будет показано окно авторизации пользователя (рис. 22.11).
ВНИМАНИЕ
Для работы в конфигураторе нужно всегда выбирать пользователя
Администратор. Если вы закроете конфигуратор, а потом захотите зайти
в него под каким-то другим пользователем, например, Гусаков, то вы
не сможете ничего разрабатывать, так как для роли Мастер
администриро-вание не разрешено.
Рис. 22.11. Окно авторизации пользователя для роли «Администратор»
Ограничение доступа к данным
на уровне записей и полей базы данных
В завершение занятия мы покажем, как можно ограничить доступ к
данным более точно в зависимости от самих данных, которые
хранятся в информационной базе.
Для этого в системе «1С:Предприятие» используется механизм
ограничения доступа на уровне записей и полей базы данных. Этот
механизм позволяет для четырех основных прав (чтение, добавление,
изменение и удаление) уточнить, какие же именно данные информационной базы будут доступны пользователю.
Такое уточнение записывается на специальном языке, являющемся
подмножеством языка запросов.
Далее на примере документа Начисления сотрудникам мы рассмотрим небольшой пример, когда мастерам нужно дать возможность
просмотреть начисленную им зарплату, но руководство запрещает им
доступ к информации о начисленной премии.
Другими словами, мастерам нужно запретить просмотр тех документов Начисления сотрудникам, в которых есть записи о начислении
премии.
В режиме «Конфигуратор»
Для решения этой задачи сначала установим для роли Мастер право
Просмотр для документа НачисленияСотрудникам.
Поскольку этот документ принадлежит подсистеме РасчетЗарплаты,
дадим право на просмотр этой подсистемы. Также дадим права на
просмотр справочника ВидыГрафиковРаботы и плана видов расчета
Основные начисления, т.к. ссылки на эти объекты использу-ются в
документе НачисленияСотрудникам. Вернемся к редактиро-ванию
прав для документа НачисленияСотрудникам.
Как мы видим, при установке права Просмотр право Чтение
документа НачисленияСотрудникам установилось автоматически.
Выделим его. В правой нижней части экрана находится поле Ограничение доступа к данным. Нажмем кнопку Добавить (рис. 22.12).
Мы хотим запретить доступ ко всем полям документа Начисления
сотрудникам.
Рис. 22.12. Добавление ограничения доступа для роли «Мастер»
Поэтому мы не будем выбирать поля, а нажмем кнопку выбора в поле
Ограничение доступа (рис. 22.13).
Рис. 22.13. Вызов редактора ограничений доступа
Откроется окно Ограничение доступа, в котором можно задать текст
на специальном языке, являющемся подмножеством языка запроса.
Для облегчения работы мы воспользуемся конструктором запроса.
Нажмем кнопку Конструктор запроса.
Откроется конструктор ограничений доступа к данным. Он похож на
конструктор запросов (см. рис. 22.14).
Таблица НачисленияСотрудникам автоматически попала на закладку
Таблицы и поля, а конструктор открылся на закладке Условия.
Перенесем в список условий поле ВидРасчета табличной части
Начисления, установим флажок Произвольное и заполним правую
часть условия, как показано в листинге 22.1 (рис. 22.14).
Листинг 22.1. Ограничение доступа к данным
НачисленияСотрудникам.Начисления.ВидРасчета <> ЗНАЧЕНИЕ(
ПланВидовРасчета.ОсновныеНачисления.Премия)
Рис. 22.14. Конструктор ограничений доступа к данным
Нажмем ОК (рис. 22.15).
Текущий пользователь имеет право прочитать или изменить
некоторый объект базы данных только в том случае, если
ограничение доступа предоставляет ему такое право. То есть когда
условие ограни-чения истинно.
Рис. 22.15. Текст ограничения доступа к данным
В нашем случае пользователь сможет прочитать документ Начисления сотрудникам НачисленияСотрудникам ГДЕ… только в том
случае, если в его табличной части Начисления … ГДЕ НачисленияСотрудникам.Начисления … есть виды расчета … ГДЕ НачисленияСотрудникам.Начисления.ВидРасчета …, не являющиеся видом
расчета Премия … <> ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисления.Премия).
Нажмем ОК.
Окно ограничений доступа к данным для роли Мастер будет
выглядеть следующим образом (рис. 22.16).
Рис. 22.16. Ограничение доступа для роли «Мастер»
В режиме «1С:Предприятие»
Обновим информационную базу, нажав F7. А теперь запустим
прикладное решение не как обычно, из конфигуратора в режиме
отладки, а в режиме 1С:Предприятие, и выберем пользователя с
ролью Мастер, например Гусакова (рис. 22.17).
Рис. 22.17. Окно авторизации пользователя для роли «Мастер»
В разделе Расчет зарплаты откроем список документов НачисленияСотрудникам (рис. 22.18).
Рис. 22.18. Список документов «Начисления сотрудникам»
Как мы видим, в списке показаны только документы № 1 и № 3, так
как в документе № 2 начисляется премия.
Хотя это и не относится к вопросу ограничения доступа к данным,
поясним по ходу еще один момент.
На рис. 22.18 мы видим внизу окна приложения панель истории. Так
получилось потому, что еще на третьем занятии, в момент заполнения данными первого справочника, мы задали ее отображение в
конфигураторе. Затем мы убрали видимость этой панели, но уже в
режиме 1С:Предприятие. Но, как уже говорилось, настройка панелей
прикладного решения в режиме 1С:Предприятие относится только к
тому пользователю, кто эту настройку выполнил, в то время как
настройка отображения панелей в конфигураторе относится к
конфигурации в целом. В тот момент у нас еще не было заведено
пользователей, поэтому панель истории стала опять видна. И так
будет для каждого нового пользователя.
Чтобы этого не происходило, вернемся в конфигуратор и уберем
видимость панели истории. Эта настройка будет действовать сразу
для всех пользователей.
В режиме «Конфигуратор»
Выделим корень дерева объектов конфигурации и из контекстного
меню выберем пункт Открыть интерфейс клиентского приложения. В
появившемся окне Интерфейс клиентского приложения выделим
элемент Панель истории в левом списке и нажмем кнопку Удалить в
командной панели окна (рис. 22.19).
Рис. 22.19. Настройка панелей прикладного решения в конфигураторе
Вернемся к вопросу ограничения доступа к данным.
Немного усложним задачу. Мы все так же не хотим, чтобы мастер
видел начисленные премии, но в то же время не хотим скрывать от
него факт существования такого документа.
Другими словами, в списке документов мастер должен его видеть, но
не должен иметь возможности открыть его.
Посмотрим на наше ограничение доступа к данным документа Начисления сотрудникам для роли Мастер.
Мы не задавали никаких полей, поэтому ограничение применяется ко
всем полям документа (см. рис. 22.16).
Поэтому сейчас мы безусловно разрешим читать те поля документа,
которые необходимы для отображения документа в списке.
Тем самым мы разрешим документу отображаться в списке. Но
поскольку существующее условие на прочие поля мы удалять не
будем, то открыть документ, как и раньше, можно будет только в том
случае, если в его табличной части есть виды расчета, отличные от
Премия.
Добавим к ограничениям доступа еще одно условие.
В списке полей выберем поля:
 Ссылка,
 ПометкаУдаления,
 Номер,
 Дата,
 Проведен.
В ограничении доступа напишем ГДЕ ИСТИНА (рис. 22.20).
Рис. 22.20. Установка ограничений доступа к данным для роли «Мастер»
Закроем окно редактирования прав.
В режиме «1С:Предприятие»
Обновим информационную базу, нажав F7, и запустим «1С:Предприятие» для пользователя с ролью Мастер, например, для пользователя Гусаков.
В разделе Расчет зарплаты откроем список документов НачисленияСотрудникам (рис. 22.21).
Рис. 22.21. Список документов «Начисления сотрудникам»
В списке документов мы увидим все документы начислений.
Документы № 1 и № 3 мы сможем открыть и просмотреть, но при
попытке открыть документ № 2 мы получим сообщение о нарушении
прав доступа (рис. 22.22).
Рис. 22.22. Сообщение о нарушении прав доступа к данным
То есть мы добились того, чего хотели.
Теперь обратим внимание на следующий момент.
Все хорошо, пока в документе № 2 содержатся записи только о
расчете премии. Но вспомним, как формулируется наше ограничение доступа: пользователь сможет прочитать документ Начисления
сотрудникам только в том случае, если в его табличной части Начисления есть виды расчета, не являющиеся видом расчета Премия.
Это значит, что если в этом документе окажутся виды расчета,
отличные от Премия, мастер сможет его открыть и просмотреть.
Убедимся в этом.
Запустим «1С:Предприятие» от имени пользователя Администратор.
В разделе Расчет зарплаты откроем список документов НачисленияСотрудникам. Откроем документ № 2 и скопируем любую его
строку. В новой строке изменим вид расчета на Оклад. Проведем и
закроем документ. Закроем «1С:Предприятие».
Теперь запустим «1С:Предприятие» от имени пользователя Гусаков.
Точно так же в разделе Расчет зарплаты откроем список документов
НачисленияСотрудникам.
Откроем документ № 2. Документ откроется, и мы увидим все его
строки.
В режиме «Конфигуратор»
Вернемся в конфигуратор.
Для того чтобы документ невозможно было просмотреть и в этой
ситуации, нам нужно будет изменить существующее условие ограничения доступа.
Новое условие будет более сложным, поэтому заодно мы продемонстрируем использование шаблонов в ограничениях доступа.
Итак, откроем роль Мастер и перейдем на закладку Шаблоны ограничений (рис. 22.23).
Здесь добавим новый шаблон, назовем его ЕстьПремия.
Рис. 22.23. Добавление шаблона ограничений доступа к
данным для роли «Мастер»
Текст шаблона будет выглядеть следующим образом (листинг 22.2).
Листинг 22.2. Ограничение доступа к данным
ВЫБРАТЬ
1
ИЗ
Документ.НачисленияСотрудникам.Начисления
ГДЕ
Документ.НачисленияСотрудникам.Начисления.ВидРасчета =
ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисления.Премия)
И Документ.НачисленияСотрудникам.Начисления.Ссылка = #Параметр(1).Ссылка
По сути это запрос к табличной части документа НачисленияСотрудникам, который либо не вернет нам ничего, либо вернет одну запись с
одним полем, в котором будет значение 1.
Такую запись он вернет нам в том случае, если в табличной части
документа есть вид расчета Премия.
Второе условие в этом запросе нужно нам для того, чтобы указать,
табличная часть какого именно документа нас интересует. В этом
условии используется возможность указания параметров в шаблоне.
Листинг 22.3. Ограничение доступа к данным
И Документ.НачисленияСотрудникам.Начисления.Ссылка = #Параметр(1).Ссылка
Вместо #Параметр(1) будет подставлена та строка, которую мы
укажем при вызове этого шаблона в условии ограничения доступа.
Теперь вернемся на закладку Права.
В имеющемся ограничении прав доступа для прочих полей (в первой
строке списка ограничений) заменим старый текст новым (листинг
22.4), рис. 22.24.
Листинг 22.4. Ограничение доступа к данным
ДокНачисления ГДЕ НЕ 1 В (#ЕстьПремия(“ДокНачисления”))
Рис. 22.24. Установка ограничений доступа к данным для роли «Мастер»
Здесь с помощью конструкции #ЕстьПремия(«ДокНачисления») мы
обращаемся к нашему шаблону. Текст шаблона просто механически
будет подставлен в это место, причем строка ДокНачисления заменит
собой первый параметр шаблона (#Параметр(1)).
Как мы уже говорили, если в табличной части есть начисление
Премия, запрос в шаблоне вернет единственную запись со значе-нием
1.
Поэтому это условие (см. листинг 22.4) разрешит нам прочитать
ДокНачисления тогда, когда запрос из шаблона не возвращает 1:
ГДЕ НЕ 1 В (#ЕстьПремия(“ДокНачисления”))
То есть тогда, когда в табличной части нет начисления Премия.
Можно было бы записать это условие ограничения и без использования шаблонов.
Но, во-первых, такая запись была бы менее читаемой (листинг 22.5),
а во-вторых, использование шаблонов позволяет выделить и не
дубли-ровать части условий ограничений, которые могут
использоваться в разных условиях.
Листинг 22.5. Ограничение доступа к данным
ДокНачисления ГДЕ НЕ 1 В (
ВЫБРАТЬ
1
ИЗ
Документ.НачисленияСотрудникам.Начисления
ГДЕ
Документ.НачисленияСотрудникам.Начисления.ВидРасчета =
ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисления.Премия)
И Документ.НачисленияСотрудникам.Начисления.Ссылка =
ДокНачисления.Ссылка)
Закроем окно редактирования прав. Проверим, как это работает.
В режиме «1С:Предприятие»
Обновим информационную базу, нажав F7, и запустим «1С:Предприятие» от имени пользователя Гусаков.
В разделе Расчет зарплаты откроем список документов НачисленияСотрудникам.
Как вы помните, в документе № 2 есть строки и с видом расчета
Премия, и с видом расчета Оклад. Раньше этот документ у нас открывался.
Попробуем открыть его теперь.
Мы получим сообщение о нарушении прав доступа, что нам и требовалось (см. рис. 22.22).
В режиме «Конфигуратор»
Поскольку пример с ограничением прав доступа на уровне записей и
полей базы данных мы делали скорее в демонстрационных целях,
вернемся к исходному состоянию конфигурации.
Снимем для роли Мастер право Чтение для документа НачисленияСотрудникам. Снимем право Просмотр для подсистемы
РасчетЗарплаты. Снимем право Чтение для справочника ВидыГрафиковРаботы и для плана видов расчета Основные начисления. Запустим
«1С:Предприятие» от имени пользователя Администратор. В разделе
Расчет зарплаты откроем список документов Начисле-нияСотрудникам.
Откроем документ № 2 и удалим последнюю строку (которую мы
добавляли). Проведем и закроем документ.