1. Вводная часть
1.1. Введение во введение
Настоящий курс является продолжением курса Введение в конфигурирование в системе 1С:Предприятие 8.0. Основные объекты. Подразумевается, что у обучаемого уже имеется определенная ясность по приемам работы в конфигураторе.
Основная цель данного курса - получить навыки самостоятельной работы по созданию оперативных учетных и управленческих решений.
Поэтому будем придерживаться следующей технологии изучения материала каждой главы:
С прикладной точки зрения обучение будет происходить в процессе создания конфигурации, реализующей как учет основных торговых операций, так и управленческий блок планирования и контроля работы отдела активного маркетинга.
1.2. Объектная схема построения конфигураций для решения учетных и управленческих задач.
В рамках предыдущего курса Вы познакомились с основными классами объектов, применяемыми в системе 1С:Предприятие 8.0. Начинающих программистов при этом всегда гнетет одна и та же мысль: Хорошо, а как со всем этим работать? Когда и что применять?.
Вот поэтому, прежде чем приступать к постижению тайн организации решений оперативных задач в системе - сначала немного осмотримся.
Итак, какие основные классы объектов нужно иметь для реализации учетных и управленческих задач.
Начнем с глубины веков. Когда появилось вообще понятие учета?
Правильно - учет появился только при появлении документирования. Вот сохранились со времен древнего Египта папирусы и таблички с долговыми расписками и книгами продаж -мы констатируем, да - был учет в древнем Египте! А был ли раньше? Может, и был. Но раз документов не сохранилось - то учесть факт появление учета ранее ... не представляется возможным.
Конфигурирование в системе "1С:Предприятие 8.0". Решение оперативных задач
Итак, основа любой системы учета ДОКУМЕНТ. Потому как
документ есть ничто иное, как объект, предназначенный для
регистрации событий, важных с точки зрения некоей предметной
области.
Вот паспорт - документ? Документ! А какое событие он регистрирует? Правильно - признание Вашего гражданства.
Трамвайный талон - документ? Правильно - документ, фиксирует потенциальную оплату проезда (когда прокомпостируете - будет фиксировать уже реальную). И так далее...
Какой документ в окружающей жизни ни возьми - это объект для регистрации некоего события, да еще и запоминающий сопутствующую этому действию информацию.
Таким образом, в систему 1С:Предприятие просто необходимо было внести класс объектов Документ. Именно посредством объектов даннVго класса и будут вноситься и регистрироваться в системе произошедшие события бизнес-процессов, хозяйственной деятельности, в общем - предметной области.
Идем далее.
Есть класс объектов для регистрации входящей информации - логично предположить необходимость класса объектов для ее обобщения, формирования и вывода в удобном для пользователя виде. Это ОТЧЕТЫ.

Можно было бы конечно ограничиться набором этих двух классов объектов.
Но...давайте вспомним славную молодость на колхозных полях, когда колхозники помогают интеллигенции убирать урожай...(те, кто этого в жизни не испытал - ну что ж, напрягите воображение...)
На краю бурта обязательно сидит бригадир тетя Нюра и при высыпании очередного ведра корнеплодов в бурт рисует очередную палочку у себя в тетради.
Приезжает в конце дня председатель колхоза и спрашивает: тетя Нюра, сколько сегодня ведер?. И начинает тетя Нюра палочки считать в тетради.... В зависимости от ее способностей и аккуратности за время от 10 минут до получаса ответа дождаться можно ... Вот, это как раз пример быстродействия простейшей учетной схемы: Документы- отчеты.
Вводная часть
А вот если бы где-то еще промежуточные данные для отчета накапливать. А вот если бы, кроме записи в тетрадочке, тетя Нюра еще на краю бурта после очередного высыпания исправляла мелком 67 ведер на 68, 68 на 69 и т.д., то по приезду председателя - сколько времени понадобилось бы на выдачу точного отчета?
Таким образом, если ввести в систему класс объектов Регистры учета - получаем средство быстрого формирования отчетности за счет предварительного накопления и подготовки отчетных данных.

Платформа 1С:Предприятие 8.0 имеет в своем составе несколько классов регистров учета. Это:
Часть из них мы обстоятельно и подробно изучим в данном курсе. Сейчас бы хотелось заострить внимание только на их предназначении.
Да, создавая регистры учета - мы намеренно вносим в систему избыточность. Как правило, регистры получают информацию из документов, а не от пользователя (напрямую). Но за счет использования регистров неимоверно возрастает простота и скорость получения отчетной информации.
Причем, в системе 1С:Предприятие 8.0 с помощью регистров можно учитывать не только фактические, но и ПЛАНОВЫЕ операции (т.е. те, что должны произойти в будущем).
Итак, уже три класса объектов.
Необходимость в следующем классе объектов возникнет в случае, когда нашей автоматизированной системой учета будет пользоваться более одного человека.
Если дать возможность пользователям набирать наименования вручную при вводе товаров в накладных, то будьте готовы к следующей ситуации:
Товаровед оприходовал поступление товара Огурцы свежие, а менеджер выпишет в расходной накладной Свежие огурцы. Ну, ... и как системе понять - что это одно и то же?
Конфигурирование в системе "1С: Предприятие 8.0 ". Решение оперативных задач
Вот потому и необходимы классы объектов для ведения справочной информации.
Ситуация с огурцами легко преодолевается в том случае, если реквизит документа товар имеет не строковый тип, а ссылку на элемент СПРАВОЧНИКА Номенклатура - тогда и товаровед, и менеджер будут вынуждены выбирать один и тот же элемент.

Таким образом, классы справочных объектов служат, прежде всего, для организации правильного заполнении документов.
К подобным классам в системе 1С:Предприятие 8.0 можно отнести собственно сам класс объектов конфигурации СПРАВОЧНИКИ, а так же ПЕРЕЧИСЛЕНИЯ, КОНСТАНТЫ, ПЛАНЫ СЧЕТОВ, ПЛАНЫ ВИДОВ ХАРАКТЕРИСТИК, ПЛАНЫ РАСЧЕТОВ и т.д.
В результате мы с Вами логически вышли на ту систему классов объектов, что реализована средствами платформы 1С:Предприятие 8.0.
1.3. Роль и место регистров
Задачи, которые Вам предстоит решать в системе 1С;Предприятие, скорее всего, можно классифицировать, как управленческие или учетные.
А для того, чтобы утверждать, что какое-то явление полностью учтено (находится под управлением) обычно требуется доказать это.
В качестве доказательства предъявляют... значения контролируемых ПОКАЗАТЕЛЕЙ.
Таким образом, мы вышли с Вами к корню автоматизации любой учетной задачи. Система, автоматизирующая учет, или служащая для управления чем-либо - обязана максимально быстро, максимально точно быть готовой предоставлять информацию по тем ПОКАЗАТЕЛЯМ, состояние которых ей надлежит регистрировать.
Вводная часть
Все, что мы с Вами делаем, имеет конечной целью выдачу информации по этим показателям. Поскольку именно отчетность - это средство обеспечения существования бизнеса (регламентированная отчетность) и средство анализа (управленческая отчетность).
Давайте разберемся теперь с природой возможных показателей. Для
любого явления их можно придумывать сотни и тысячи. (По законам
Паркинсона, любая бюрократическая система естественным образом
увеличивает количество контролируемых показателей
экспоненциально с течением времени, вплоть до момента удушения дела, которым полагалось управлять.)
Но все их можно классифицировать по трем группам:
Первая группа - показатели остатка
Используются для учета явлений, которые то прирастают, то убывают, но нам необходимо знать состояние их на последний (или на каждый) момент времени. Таких показателей великое множество: количество товара на складе, сумма денег в кармане, число космонавтов на орбите и так далее.
Для проверки а не показатель ли это остатка можно сделать маленький тест:
Я положил в карман за сегодняшний день 10 рублей, 5 рублей и вынул 11 рублей. Могу ли я точно сказать - сколько денег у меня в кармане?
Думаете 4?
Ну, Вы же не в первом классе!
На самом деле, может быть и 4 и 104 и 997. Все зависит от того, что у меня со вчерашнего дня в кармане лежало!
Так вот, текущее состояние показателей остатка тесно связано с прошлым их состоянием. Это и является отличительным критерием!
Чаще всего показатели остатка используются в экономических задачах. Потому как, например, рыночная экономика - есть ничто иное, как оптимальный способ хозяйствования в условиях ограниченности ресурсов. Ну а уж если априорно ресурсы ограничены - то не контролировать их состояние просто нельзя!
Вторая группа - показатели оборотные.
Тот же пример Я положил в карман за сегодняшний день 10 рублей, 5 рублей и вынул 11 рублей.
Могу ли я точно сказать - сколько денег В ТЕЧЕНИЕ ДНЯ я положил в карман?
Могу! 15!
8
Конфигурирование в системе "1С:Предприятие 8.0". Решение оперативных задач
Показатели оборотные как раз и характеризуют движение за какой-то период. Причем заметьте, учитываются явления, растущие только в одну сторону. И выдается информация по совокупному обороту этого явления за указанный период.
Критериями принадлежности показателя к классу оборотный являются:
Наиболее часто оборотными показателями интересуются задачи статистики.
ВВП России за год, Прирост пионеро-киллограмов за месяц, Уменьшение человеко-жалоб за отчетный период...
Третья группа - показатели состояния.
Оба вышерассмотренных класса показателей, несмотря на разные подходы, имели одно общее свойство: это все показатели накопления. То есть события происходят одно за другим и что-то прибавляют или убавляют в состоянии того или иного показателя.
Но, кроме того, полезно выделить еще класс показателей характеризующие состояния чего бы то ни было.
Например, такого-то числа, такого-то месяца, года Вы стали пожизненным президентом такой-то страны. Вот стали и все...
То, что Вы президент - это показатель? Ну, как минимум - пVказатель Ваших возможностей. К какому же классу его отнести? Зависело это состояние от прошлых Ваших состояний? Да вообще-то могло и не зависеть... Вот, если бы Вас поточным методом и соседние страны стали президентом избирать - тогда показатель Скольких стран президент - был бы показателем остатка. Но на это надежды мало. Хотя...
Может это оборотный показатель? Тогда было бы так: За отчетный квартал текущего года президентом скольких стран Вы стали? . А вот - нискольких!
Вы президент только одной страны еще с прошлого года. Вот единственная и достаточная характеристика текущего положения. Использование для нее показателей остатков слишком избыточно, а показателей оборотных - неинформационно.
Таким образом, разовые явления, устанавливающие некие показатели в определенное состояние, лучше всего отражать посредством показателей состояния.
Вводная часть
Критерием отнесения к классу показателей состояния является следующий:
Устанавливаемое состояние в принципе не зависит от прошлого состояния, но будет действовать не только в рамках какого-то жесткого периода, а или вечно, или до следующей смены состояния. Причем зачастую смена состояния происходит в произвольный момент времени.
Примерами таких показателей могут быть: котировки акций на бирже, курсы валют, местонахождение конкретного сотрудника (на работе, болен, в отпуске) и так далее...
Для чего мы подробнейшим образом разбирали и классифицировали все типы показателей?
Как уже выяснилось, задача любой системы учетной или управленческой - мгновенно выдавать информацию по состоянию того или иного показателя.
Мгновенно - это значит - сводя к минимуму затраты времени на расчеты значения. А чтобы ничего не считать, и сразу взять готовое значение - необходимо, чтобы что-то или кто-то это значение уже знал, и на всякий случай держал.
Этим чем-то в системе 1С:Предприятие 8.0 являются регистры.
Итак, РЕГИСТРЫ - объекты, предназначенные для хранения и практически мгновенной выдачи значений тех или иных показателей в произвольных разрезах.
Для хранения показателей остатков и оборотов служат Регистры накопления с соответствующими видами.
Для хранения показателей состояния служат Регистры сведений.
Кроме того, для более удобного хранения информации в интересах специфических механизмов учета есть еще Регистры бухгалтерии и Регистры расчета.
Первые служат для обслуживания задач бухгалтерского учета (работа с планом счетов, с поддержкой корреспонденции или без нее).
Вторые для реализации задач периодических расчетов. Когда из периода в период по примерно оинаковым законам производят примерно однотипные расчеты. Т.е. расчет зарплаты, биллинговые системы операторов сотовой связи и т.д.
В рамках данного курса с последними (бухгалтерскими и расчетными) регистрами мы знакомиться не будем. Сосредоточимся на классических задачах оперативного управления торговлей. Для них достаточно будет Регистров накопления и Регистров сведений.
Конфигурирование в системе "1С:Предприятие 8.0". Решение оперативных задач
1.4. Постановка задачи на создание конфигурации для подразделений активных продаж
Чтобы изучение курса не свелось к восприятию голой теории -поставим практическую задачу, которую надо будет решить в процессе его прохождения.
Необходимо на базе конфигурации от предыдущего курса Введение в конфигурирование в системе 1С:Предприятие 8.0. Основные объекты создать конфигурацию, предназначенную для:
ю
2. Работа с регистрами (на примере регистра остатков)
2.1. Регистр остатков. Структура простейшего регистра. Измерения и ресурсы. Регистратор и Период. Граница периода
Регистры являются средством хранения состояния показателей остатков, оборотов или состояния и формирования текущих итогов. Именно поэтому очень важно правильно организовать регистры, а для этого необходимо знать, как они устроены и как в них заносится информация.
Для работы с регистрами необходимо будет уяснить следующие понятия:
Структура регистров задается в конфигураторе (регистры - элементы метаданных) и определяется, прежде всего, набором измерений (объектов, в разрезе которых ведется учет) и набором ресурсов (показателей и характеристик, которые требуется подсчитывать или учитывать).
Чтобы представить структуру регистра, рассмотрим следующий пример регистра накопления (вида Остатки),
опустим, мы работаем в лесничестве, и самый главный лесник послал нас в рощу Кудрявая подсчитывать деревья. Результат подсчета можно представить в виде гистограммы:
и
Конфигурирование в системе "1С:Предприятие 8.0". Решение оперативных задач

С задачей справились, теперь осознаем, что мы сделали.
Мы представили в разрезе (по измерению) Тип дерева информацию о деревянных ресурсах рощи Кудрявой. Если после нашего отчета последует указание о проведении лесоповала (а в конфигурации это равносильно проведению одноименного документа) - это может существенно сократить наличные ресурсы.
Таким образом, мы создали простейший регистр с одним измерением и одним ресурсом.
А если потребуется представить данные не только по одной роще, а в разрезе всех окрестных лесов (дубрава Тенистая, массив Забугорье и т.д.), то волей-неволей придется добавлять к нашей гистограмме - ... правильно, еще одно измерение. То есть делать ее трехмерной.
А если еще что-нибудь добавить? Для удобства тогда лучше информацию представлять уже не в виде гистограммы, а в виде таблички:
12
Работа с регистрами (на примере регистра остатков)
Измерения |
Ресурс |
|
Лес |
Тип дерева |
Количество |
Роща Кудрявая |
Сосна |
16 |
Роща Кудрявая |
Береза |
10 |
Роща Кудрявая |
Дуб |
5.5 |
Дубрава Тенистая |
Береза |
12 |
Дубрава Тенистая |
Дуб |
21 |
Питомник |
Береза |
48 |
Состав любого регистра должен быть таким, чтобы для каждого значения ресурса в любой момент времени можно было бы однозначно определить значения всех измерений.
Т.е., если уж у Вас два измерения Лес и Тип дерева, то при проведении лесоповала Вы должны точно указывать, сколько каких деревьев и в каком лесу надо валить. За это Ваш благодарный регистр всегда будет быстро и точно сообщать, в каком лесу, сколько чего осталось, т.е. выдавать остатки ресурсов.
Кроме измерений и ресурсов в регистре могут присутствовать реквизиты. Реквизит также может иметь любой тип значения, но в отличие от измерения, реквизит - только характеристика движения. Это признак, пометочка на память. Как, например, если бы мы при проведении лесоповала помечали, что эта партия древесины пошла на Сыктывкарский комбинат, следующая на Одинцовский и т.п.

Реквизиты никак не влияют на расчет остатков. Таким образом, при выборе остатков из регистра, значения реквизитов программисту не доступны, но если он выбирает записи (движения) по регистру, то значения реквизитов можно получить, в чем-то накопить и представить для отчета. Кроме того, реквизиты можно использовать и при построении запросов по регистрам.
13
Конфигурирование в системе "!С:Предприятие 8.0". Решение оперативных задач
При проектировании структуры регистров нужно учитывать следующие обстоятельства:
Понятие Границы периода рассчитанных итогов связано с внутренним порядком хранения данных в реальных таблицах регистра. На каждый регистр выделяется две таблицы. Первая хранит сами записи движений (приращения). Вторая - рассчитанные итоги по этим записям.
При получении итогов система всегда посчитает их правильно, но чем ближе к реальной дате граница периода рассчитанных данных в таблице итогов - тем быстрее система будет выдавать требуемые данные. Если точнее - то при получении итогов на круглую дату (помесячно) система берет уже готовые итоги, а на некруглую дату просматривает движения от ближайшей круглой даты
Управлять положением границы периода можно в пользовательской части программы. Меню Операции, пункт Управление итогами. Попадаем в системное диалоговое окно Управление итогами.

14
Работа с регистрами (на примере регистра остатков)
Как видите, можно управлять итогами для всех регистров сразу, а можно - отдельно.
Теперь поговорим подробнее о технологии записи движений.
В любой строгой системе учета недостаточно только предоставлять информацию о состоянии того или иного ресурса. Например: Спирта на складе больше нет.
Необходимо еще иметь возможность предоставить по первому требованию проверяющих органов документальное подтверждение правомерности этого состояния:
Вот акт приемки от такого-то числа, вот приказ от такого-то за подписью дирMктора выдать такого-то числа группе монтеров 10 литров, а вот расписка о реквизиции остатков, полученная вчера!.
Именно поэтому в регистрах накопления для корректного внесения записи (приращения ресурсов) обязательны для заполнения поля Регистратор и Период.
Регистратор - это атрибут, содержащий ссылку на документ, изменивший состояние ресурсов регистра.
Период - атрибут, указывающий на период (момент времени), с которого действуют данные изменений ресурсов.
Необходимо упомянуть еще один атрибут регистра остатков -ВидДвижения. Посредством данного атрибута указывается -необходимо прирастить ресурсы или убавить.
Практикум №1
В базе от предыдущего курса есть регистр Остатки-Номенклатуры, позволяющий вести учет товаров на складе. Учтем еще и состояние задолженностей. Создайте регистр Задолженности таким образом, чтобы он позволил в разрезе контрагентов учитывать их долги. На будущее договоримся - если долг положительный — это нам контрагент должен, если отрицательный - это мы ему должны.
2.2. Возможные способы записи движений по регистру
Прежде всего, разберемся - что значит сформировать движения.
А значит это очень простую вещь. Требуется сформировать запись в регистре, куда попадут нужные данные. Чаще всего данные берутся непосредственно из документа, то есть считываются из соответствующих реквизитов.
Всего же можно классифицировать четыре различных способа формирования движений:
15
Конфигурирование в системе " 1С:Предприятие 8.0". Решение оперативных задач

1) при проведении документов
Движения можно сформировать в модуле объекта Документ
посредством процедуры - обработчика событий
ОбработкаПроведения().
Разберем подробно этот способ на примере проведения Приходной накладной. Тело процедуры сформировано конструктором движений еще в прошлом курсе. (Если Вы тогда не успели - сформируйте сейчас)
Выглядит следующим образом:

Процедура ОбработкаПроведения(Отказ, Режим)
//{{_КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ // Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
//1
Для Каждого ТекСтрока Товары Из Товары Цикл // регистр ЦеныПоставшиков
Движение = Движения. Цен ыПостав щи ков. ДобавитьО; Движение. Период = Дата; Движение, Регистратор = Ссылка; Движение. Поставщик = Контрагент; Движение. Номенклатура = ТекСтрокаТовары. Номенклатура;
16
Работа с регистрами (на примере регистра остатков)
Движение.Цена = ТекСтрокаТовары.Цена;
//КонецЦикла;
//Для Каждого ТекСтрокаТовары Из Товары Цикл // регистр Остатки Номенклатуры Приход
Движение = Движения.ОстаткиНоменклатуры.ДобааитьО; //2
Движение.ВидДвиженPя = ВидДвиженияНакопления. Приход; //3
Движение.Период = Дата; //4
Движение. Регистратор = Ссылка; /15
Движение.Номенклатура - ТекСтрокаТовары.Номенклатура; //6 Движение.Количество = ТекСтрокаТовары. Количество; Движение.Сумма = ТекСтрокаТовары. Сумма;
КонецЦикла;
// записываем движения регистров
Движения.ЦеныПоставщиков.Записать();
Движения.ОстаткиНоменклатуры.Записать(); //7
//}}_КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ КонеиПроцедурыКонецПроцедуры
Комментарий к тексту процедуры:
Процедура содержит запись движений в регистр сведений ЦеныПоставщиков - этот кусочек комментировать не будем. Разберем только то, что касается движений по регистру ОстаткиНоменклатуры.
//1 В регистре имеется измерение Номенклатура. В документе Номенклатура является реквизитом табличной части Товары. Соответственно, чтобы иметь возможность по каждому товару сформировать движение - необходимо это делать в цикле перебора строк табличной части документа.
//2 ДокументОбъект (а именно в нем мы сейчас находимся) имеет свойство Движения. Данное свойство предоставляет доступ к коллекции наборов записей движений документа. В нашем случае обращаемся к ОстаткиНоменклатуры и получаем возможность добавить в него новую запись.
//3 записывать атрибуты (свойства) новой записи начинаем с ВидаДвижения. Производим это следующим образом:
Существует системное перечисление ВидДвиженияНакопления. У него есть только два значения Приход и Расход. Поскольку накладная приходная - нам нужен как раз Приход.
Кстати, вместо конструкции
Движение = Движения.ИмяРегистра.ДобавитьО;
Движение. ВндДвижения = ВндДвиженияНакопления.Приход;
Можно было бы написать:
17
Конфигурирование в системе " 1С. Предприятие 8.0 ". Решение оперативных задач
Движение = Движен и я.Имя Регистра. ДобавитьПриходО;
Эффект был бы тот же.
//4 указываем период действия данного движения. В данном случае мы присвоили ему значение, взятое из свойства документа Дата. (Как Вы помните, в системе 1С:Предприятие 8.0 дата - это не только день, но еще и часы, минуты, секунды.) Но с таким же успехом мы могли присвоить и любую другую дату! В ЮПредприятии 8.0 период действия движения может и не совпадать с датой документа. Это позволяет, например, использовать документы замедленного действия, результат проведения которых скажется в определенный, Вами заданный, момент! Например - при решении задач планирования.
115 записываем значение регистратора движения. В данном случае мы воспользовались ссылкой на сам документ. Можно было бы даже сослаться и на другой, если только этот другой имеет право делать движения по данному регистру. Именно эта особенность будет впоследствии использована при реализации третьего способа записи движений (извне). Но поскольку движения записываются посредством использования свойства Движения данного документа, то регистратором система все равно пропишет его!
//6 заполняем значения атрибутов записи регистра (измерений и ресурсов) значениями, взятыми из реквизитов строки табличной части документа.
Ill записываем получившийся в процессе выполнения цикла по строкам документа набор записей непосредственно в регистр,
Практикум №2
Добавить е процедуру проведения приходной накладной проведение по
регистру Задолженности. Поскольку при получении товара
выходит, что мы его берем в долг значит, движение должно быть
-расход.
Добавить в конфигурацию документы ПКО и РКО (реквизиты
Контрагент и Сумма) и проводить их по регистру
Задолженности. ПКО заолженность должена РКО


Заметьте, наш долг увеличивается, когда ресурс долг уменьшается, и наоборот, а долги клиентов -растут и уменьшаются соответственно ресурсу.
2) из модуля документа
В предыдущем способе одновременно формировались движения документа, и документ проводился. Признак документ проведен на самом деле означает тот факт, что обработка документа пользователем ПОЛНОСТЬЮ завершена. Однако, что делать,' если до окончания
18
Работа с регистрами (на примере регистра остатков)
обработки еще далеко, а какие-то движения по регистрам документ уже совершить должен?
Так вот, любая процедура в модуле документа, через свойство Движения может записать новые движения. Если эта процедура называется не ОбработкаПроведения() (и не вызывается из нее) -тогда создастся ситуация, при которой документ не проведен, но движения у него есть.
Чтобы оценить прикладное значение этой возможности, добавим в документ Расходная накладная процедуру предварительной блокировки товара.
С прикладной точки зрения это важно в случаях одновременной работы с большими документами. Пока пользователь заполняет такой документ, его коллеги могут перехватить товар. И при проведении документа может вдруг выясниться, что отпустить половину номенклатурных позиций уже невозможно. Они отданы другим покупателям.
Именно поэтому полезно еще на этапе заполнения документа каким-то образом блокировать товар (захватывать самому), причем в указанных в документе количествах.
Лучший способ запоминать подобную информацию реализуется посредством соответствующего регистра.
Итак, приступаем:
Создайте регистр БлокировкаТовара (регистр остатков), определите у него одно измерение Номенклатура, один ресурс Количество, настройте форму списка.

19
Конфигурирование в системе " 1С:Предприятие 8.0". Решение оперативных задач

В форме Документа определим свойства кнопки командной панели
управления
(добавим в существующую панель управления свою кнопку ПредПровед). Вызовем обработчик нажатия кнопки.

В модуле формы документа пропишем текст процедуры-обработчика нажатия:
Процедура ОсновныеДействияФормыПредПроведение(Кнопка)
БлокированиеТовара(); КонецПроцедуры
Из обработчика вызываем процедуру БлокированиеТовара() модуля объекта Документ.Расходная.
Непосредственно же движения по регистру выполним следующим образом:
Процедура БлокированиеТовара() Экспорт
Записать(); //1
Движения. Блокировка Товара.Очистить();
20
Работа с регистрами (на примере регистра остатков)
Для Каждого ТекСтрокаТовары Из Товары Цикл 112
Движение = Движения.БлокировкаТовара.Добавить();
Движеиие.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение. Период = Дата;
Движение.Регистратор = Ссылка;
Движение.Номенклатура = ТекСтрокаТовары. Номенклатура;
Движение.Количество = ТекСтрокаТовары-Количество;
КонецЦикла;
Движения.БлокировкаТовара.Записать(); 113
КонецПроцедуры
Прокомментируем текст процедуры:
//1 При записи движений по регистру накопления обязательно указание регистратора. Если документ еще не записан - с этим возникнут проблемы. Поэтому первым делом записываем сам документ.
Кроме того, необходимо предусмотреть очистку старых движений документа по регистру БлокировкаТовара. Иначе, если данный документ уже блокировал товар - мы рискуем добавить эти блокировки еще раз.
//2 технология формирования движения одинакова во всех случаях. Мы ее только что разбирали на примере проведения приходной накладной. Поэтому только коротко повторим основные этапы: Цикл перебора строк табличной части (чтобы добраться до каждого товара и его количества). Внутри него, посредством свойства ДокументОбъекта Движения, получаем возможность добавить записи по регистру БлокировкаТовара. Формируем очередную запись, заполняя необходимые атрибуты.
//3 Записываем сформированный набор записей регистра
БлокировкаТовара
Для чего в заголовке процедуры слово Экспорт - помните? Совершенно верно, в предыдущем курсе разбирали, как именно получается возможность вызывать процедуры модуля объекта из формы.
Теперь запустите пользовательскую часть, посмотрите, как работает наша процедура. При заполнении документа пользователь получает возможность, нажимая кнопку ПредПроведение, помещать в регистр БлокировкаТоваров информацию по уже заполненной части документа. Как воспользоваться этой информацией для реальной блокировки товаров - мы разберем чуть позже. Сейчас хотелось бы обратить Ваше внимание на следующий момент:
Если документ провести стандартным образом, посредством нажатия кнопки ОК, то система ...сначала удалит все его движения по
21
Конфигурирование в системе "1С:Предприятие 8.0". Решение оперативных задач
регистру БлокировкаТоваров, а потом проведет должным образом. Именно для этого мы и контролировали наличие свойства автоматическое удаление движений.
С прикладной точки зрения получается, что при нормальном проведении накладной товар сначала разблокируется, ну а потом, очевидно, будет уже списан.
3) извне
Любой объект, содержащий процедуру работы с набором записей регистра, может приписать любому возможному регистратору данного регистра любые движения.
Для демонстрации этой возможности вынесем процедуру Блокировка товаров из модуля документа.
С прикладной точки зрения теперь задача будет звучать так: Пользователь, просматривая список расходных накладных, должен иметь возможность заблокировать товары для тех документов, которые он выберет. Естественно, что если накладная уже проведена и товар списала, больше для нее блокировать ничего не надо
Реализуем:
В форме Списка Документа определим свойства кнопки командной
панели управления
(добавим в существующую панель управления свою кнопку ПредПровед). Создадим обработчик нажатия кнопки.

Текст процедуры-обработчика сделаем таким:
22
Работа с регистрами (на примере регистра остатков) Процедура ДействияФормыПредПровед(Кнопка)
ТекДок = ЭлементыФормы.ДокументСписок.ТекущиеДанные.Ссылка; //1
Если ТекДок.Проведен Тогда //2
Возврат; КонецЕсли;
Для КаждогоТекСтрокаТовары Из ТекДок.Товары Цикл //5
Движение = Движения.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = ТекДок.Дата;
Движение.Регистратор = ТекДок.Ссылка;
Движение.Номенклатура = ТекСтрокаТовары.Номенклатура;
Движение. Количество = ТекСтрокаТовары. Количество;
КонецЦикла;
Движения.Записать(); //6
КонецПроцедуры
Комментарий к тексту процедуры:
//1 Получаем доступ к документу в текущей строке табличного поля в форме списка документов.
//2 Поскольку блокировать есть смысл только для непроведенных документов, проведенные - отсекаем.
//3 Создаем набор записей по регистру БлокировкаТовара.
//4 Указываем, что движения будут касаться такого-то регистратора (нашего документа). Если это не сделать - ничего не получится при данном способе формирования движений.
//5 Формируем в цикле перебора строк документа очередную запись набора.
//6 Записываем все сформированные записи в регистр.
4) вручную (ручная операция)
Реализуется посредством специального документа (регистратора), которому запрещено делать движения программным способом. Но имеются интерактивные возможности непосредственного создания записей в регистре.
23
Конфигурирование в системе "1С:Предприятие 8.0". Решение оперативных задач
Добавим в конфигурацию документ РучнаяБлокировкаТовара. Никаких реквизитов и табличных частей документ содержать не должен. Более того, у него должно быть запрещено проведение!
Документ будет служить только для ручного формирования движений по регистру БлокировкаТоваров

Построим конструктором форму нашего документа.
Лучше еще на этапе работы с конструктором указать необходимость добавления в форму табличного поля для работы с движениями по регистру Блокировка Товара:

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

Работа с регистрами (на примере регистра остатков)

Укажите опять, что это должны быть движения по регистру БлокировкаТовара.
После этого останется немного доработать состав появившихся колонок.
Лучше убрать колонку Регистратор. Поскольку регистратором однозначно должен выступать данный документ.
Зато стоит добавить колонку ВидДвижения. Это позволит вручную формировать как движения Приход, так и Расход - то есть еще и снимать товары с блокировки.
Добавляя колонку, не забудьте указать свойства данные и элемент управления так, как показано на следующем рисунке:
25
Конфигурирование в системе " 1С:Предприятие 8.0". Решение оперативных задач

Практикум №3
Создайте документ Ручная коррекция задолженности, с возможностью формирования ручных записей по регистру Задолженности.
2.3. Возможные способы получения данных из регистра остатков
Использование объектной модели системы 1С:Предприятие (РегистрНакопленияМенеджер)
Одним из способов получения данных из регистров является способ обращения с использованием объектной модели данных системы 1С:Предприятие.
В частности, чтобы получить накопившиеся итоги в регистре остатков,
достаточно воспользоваться методом объекта
РегистрНакопленияМенеджер - Остатки().
26
Работа с регистрами (на примере регистра остатков) Синтаксис этого метода выглядит следующим образом:
Остатки(Момент времени, Отбор, Измерения, Ресурсы)
Где:
Момент времени (необязательный)
Тип: Дата, МоментВремени, Граница. Момент времени, на который необходимо получить остатки. Если параметр не указан или установлен в Неопределено, то будут получены текущие остатки (на максимальную дату движений регистра). Если в качестве параметра передана Дата без указания времени, то остатки будут получены на начало дня, если МоментВремени - то в остатках не будут учтены движения регистра, произошедшие в тот же момент времени. Значение по умолчанию: Неопределено.
Отбор (необязательный)
Тип: Структура. Структура, содержащая набор значений измерений
регистра, по которым надо отбирать итоги. Имя Ключа структуры
должно совпадать с именем измерения регистра, заданного в
конфигураторе.
Значение по умолчанию: Неопределено.
Измерения (необязательный)
Тип: Строка. Список измерений, для которых надо получить остатки.
Строка, содержащая имена измерений, разделенные запятыми.
Если параметр не указан или указана пустая строка, то остатки будут
сформированы по всем измерениям.
Значение по умолчанию: Неопределено.
Ресурсы (необязательный)
Тип: Строка. Список ресурсов, для которых надо получить остатки.
Строка, содержащая имена ресурсов, разделенные запятыми.
Если параметр не указан или указана пустая строка, то остатки будут
сформированы по всем ресурсам.
Значение по умолчанию: пустая строка.
Результат выполнения метода - таблица значений, заполненная итогами и содержащая колонки с измерениями, указанными в параметре Измерения, и колонки с ресурсами, указанными в параметре Ресурсы.
Разберемся с данной технологией на следующем примере:
Необходимо дать возможность пользователю контролировать в старых Расходных следующий момент: какие остатки были на складе, когда накладная выписывалась?.
Для этого покажем на форме остатки для товаров, попавших в табличную часть, причем актуальные на момент самого документа.
Прежде всего, для этого создадим реквизит формы Ост, тип -Строка:
27
Конфигурирование в системе "1С:Предприятие 8.0". Решение оперативных задач

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

28
Работа с регистрами (на примере регистра остатков)
Теперь определимся с заполнением его данных. Как и любое другое программное действие - оно должно быть ответом на некое событие. Очевидно, что событие должно быть как-то связано с табличным полем Товары формы документа.
Находим в перечне событий данного табличного поля: ПриАктивизацииСтроки и формируем для него процедуру:
Процедура ТоварыПриАктивизацииСтроки(Элемент)
ОстаткиТов = РегистрыНакопления.ОстаткиНоменклатуры; //1
ТекТовар= ЭлементыФормы.Товары.ТекущиеДанные.Номенклатура; //2
ФильтрТов = Новый Структура(); Фильтр Тов. Вставить("Номенклатура",ТекТовар);
ТаблицаОст = Остатки Тов.Остатки(Дата,Фильтр Тов, "Номенклатура",''Количество"); //з
Ост = "Тек.Ост: " + ТаблииаОст.Итог("Количество"); //4
КонецПроцедуры
Комментарий к тексту процедуры:
11\ Создаем переменную, дающую доступ к объекту РегистрНакопленияМенеджер. ОстаткиНоменклатуры.
112 Готовим структуру, содержащую фильтр по нужному товару.
//3 Получаем в таблицу значений остатки нужного товара, актуальные на дату документа.
//4 выводим на форму итог.
Практикум №4
Учесть в выводимом на форму остатке заблокированное количество товара. То есть выводить свободный остаток, который определяется как разница между остатком по регистру ОстаткиНоменклатуры и остатком по регистру Блокировка То вара.
Обеспечить, что бы остаток был виден не только при активации уже существующей строки, но и при заполнении новой.
Практикум №5
Позаботимся о следующем сервисе для пользователя; Допустим, он начинает выписывать Приходный кассовый ордер для конкретного контрагента. А программа сразу подсказывает: сколько этот контрагент нам должен. Поэтому:
29
Конфигурирование в системе "1С:Предприятие 8.0". Решение оперативных задач
При выборе контрагента в документе ПКО создать процедуру, которая проверит задолженность данной организации перед нами, и в случае, если та - положительная, пропишет эту задолженность в поле Сумма.
При выборе Контрагента в документе РКО создать процедуру, которая проверит задолженность данной организации перед нами, и в случае, если та — отрицательная (то есть, мы должны), пропишет эту задолженность в поле Сумма.

30
Конфигурирование в системе "1С:Предприятие 8.0". Решение оперативных задач

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

над разделом Таблицы конструктора.
В качестве параметров можно указать Период, на который хотим получить итоги и фильтрующее условие.
В нашем случае фильтровать есть смысл только по значениям Номенклатуры. А конструктор условия любезно подсказывает', какие операторы можно использовать в условии.
В нашем случае лучше всего подойдет В ИЕРАРХИИ. Если взять просто В, то при пустом входном параметре ПарНоменклатура получим выходную таблицу не по всем товарам, а.. .пустую.
32
Работа с регистрами (на примере регистра остатков)


Далее указываем поля, которые будем выбирать из таблицы ОстаткиНоменклатурыОстатки. Это Номенклатура с его представлением, КоличествоОстаток и СуммаОстаток:

И для того, чтобы в отчете увидеть еще обший итог по стоимости всех товаров, находящихся на складе, зайдем на закладочку Итоги. Там
33
Конфигурирование в системе "1С:Предприятие 8.0 ". Решение оперативных задач
поставим галочку Общие итоги, и укажем - по какому суммируемому полю:

На закладке Выходная форма остается только уточнить тип значения полей ввода параметров:

34
Работа с регистрами (на примере регистра остатков)
В нашем случае параметр ПарНоменклатура, естественно, должен иметь тип СправочникСсылка.Номенклатура, а параметр Дата тип Дата. Кроме того, тут же можно поменять подпись к параметру на более благозвучную. Именно ее и увидит пользователь на диалоге отчета.
Остается нажать кнопку ОК и ... любоваться, как конструктор создаст макет, диалог и процедуру формирования отчета.
Подробно текст процедуры разбирать не будем. Вы это делали уже в предыдущем курсе. Единственное, на чем заострим внимание - это на тексте запроса:
Запрос. Текст =
"ВЫБРАТЬ
| ОстаткиНоменклатурыОстатки.Номенклатура,
ОстаткиНоменклатурыОстатки.Номенклатура.Представление,
| ОстаткиНоменклатурыОстатки.КоличествоОстаток,
| ОстаткиНоменклатурыОстатки.СуммаОстаток КАК СуммаОстаток
|ИЗ
РегистрНакопления.ОстаткиНомеиклатуры.Остатки(ДатаОтчета, Номенклатура В ИЕРАРХИИ(ПарНоменклатура)) КАК ОстаткиНоменклатурыОстатки
|ИТОГИ СУММА(СуммаОстаток) ПО
I ОБЩИЕ";
Обратите внимание, все данные получаем из виртуальной таблицы ОстаткиНоменклатурыОстатки, а саму таблицу посредством конструкции:
РегистрНакопления.имяРегистра.Остаток(Период, Условие).
Период - это параметр типа Дата, Момент времени или Граница, на который будет произведен расчет итогов для формирования таблицы (то есть - не включая). Если период не указывать - данные будут получены по самую последнюю запись в регистре.
В качестве условия может выступать логическая конструкция, оперирующая с полями регистра накопления. Используется для ограничения состава записей, по которым будут выбираться итоги. В нашем случае - будем строить отчет не по всем товарам, а только по входящим в ПарНоменклатура.
Заметьте, Условие здесь применяется к исходным записям, которые содержатся в регистре, а не по уже отобранным.
35
Конфигурирование в системе "1С: Предприятие 8.0". Решение оперативных задач
И последнее замечание - в расчете для данных выходной таблицы будут использоваться только активные записи регистра!
На выходе получаем таблицу вида:
РегистрНакопления.Имя.Остатки(Период,Условие) |
|
Поле |
Тип |
Измерение |
Тип измерения |
РесурсОстаток |
Число |
То есть с измерениями и итогами ресурсов по этим наборам измерений.
В нашем случае получится таблица:

Обратите внимание, обращение к итогам ресурсов требует до авления части слова Остаток.
Практикум Мб
Постройте конструктором отчет Задолженность клиентов по таблице получения остатков регистра Задолженности с возможностью выбора клиента и указания даты в форме.
Таблица получения Оборотов
Работа с данной виртуальной таблицей похожа на то, что только что делали. Однако имеются определенные отличия, поскольку оборот -это характеристика, получаемая в интервале дат.
Для получения используется следующий синтаксис:
РегистрНакопления.имяРегистра.Обороты( НачалоПериода,КонецПериода,Периодичность, Условие).
НачалоПериода - это параметр типа Дата, Момент времени или Граница, начиная с которой будет произведен расчет итогов для формирования таблицы (вот здесь - включая).
Если период не указывать - данные будут получены с самой первой записи в регистре.
36
Работа с регистрами (на примере регистра остатков)
КонецПериода - это параметр типа Дата, Момент времени или Граница, по которую будет произведен расчет итогов для формирования таблицы (и здесь - включая).
Периодичность - используется для указания дополнительного разворота итогов по периодичности. Может принимать значения:
Период - тогда не разворачиваются; Регистратор - по документу-регистратору; День - по дням; Неделя, Месяц, Квартал, Год - соответственно.
Если период не указывать - опять же дополнительного разворачивания не будет.
В качестве Условия может выступать логическая конструкция, оперирующая с полями регистра накопления. Используется для ограничения состава записей, по которым будут выбираться итоги.
Измерение - здесь может указываться список измерений, по которым будут развернуты итоги. Если этот параметр опущен - то итоги выводятся по всем измерениям.
При получении итогов выходной таблицы будут использоваться только активные записи регистра!
На выходе получаем таблицу вида:
РегистрНакопления.Имя.Обороты(Начало,Окон чание,Периодичность, Условие) |
|
Поле |
Тип |
Период |
Дата |
Регистратор |
ДокументСсылка.Имя |
Измерение |
Тип измерения |
РесурсОборот |
Число |
РесурсПриход |
Число |
РесурсРасход |
Число |
Но имейте ввиду, что поле Период будет существовать только в том случае, если параметр Периодичность при формировании таблицы получил не пустое значение (а, например, день, месяц или год). Аналогично, поле Регистратор будет существовать, только если параметр периодичность был установлен при формировании запроса в значение: Регистратор.
37
Конфигурирование в системе "1С:Предприятие 8.0". Решение оперативных задач
Практикум №7
Постройте отчет Платежи клиентов запросом по таблице получения оборотов регистра Задолженности
Таблица получения Остатков и Оборотов
Можно сказать, что таблица получения остатков и оборотов представляет собой комбинацию двух вышеописанных способов. Основное достоинство заключается в том, что по одной виртуальной таблице можно получать данные о начальном состоянии регистра, приходе, расходе, обороте и конечном состоянии.
Для получения используется следующий синтаксис:
РегистрНакопления.имяРегистра.ОстаткиИОбороты( НачалоПериода,КонецПериода,Периодичность,МетодДололн ения, Условие).
НачалоПериода - это параметр типа Дата, Момент времени или Граница, начиная с которой будет произведен расчет итогов для формирования таблицы (вот здесь - включая).
Если период не указывать - данные будут получены с самой первой записи в регистре.
КонецПериода - это параметр типа Дата, Момент времени или Граница, по которую будет произведен расчет итогов для формирования таблицы (и здесь - включая).
Периодичность - используется для указания дополнительного разворота итогов по периодичности. Может принимать значения;
Период - тогда не разворачиваются;
Запись - по записям регистра;
Регистратор - по регистратору;
День - по дням;
Неделя, Месяц, Квартал, Год - соответственно.
Если период не указывать - опять же дополнительного разворота не будет.
МетодДополнения - параметр задающий, надо или нет показывать периоды, соответствующие значениям началоПериода и конецПериода, если в них не было никаких движений.
В качестве Условия может выступать логическая конструкция, оперирующая с полями регистра накопления. Используется для ограничения состава записей, по которым будут выбираться итоги.
38

Работа с регистрами (на примере регистра остатков)
Измерение - здесь может указываться список измерений, по которым будут развернуты итоги. Если этот параметр опущен - то итоги выводятся по всем измерениям.
В расчете для данных выходной таблицы будут использоваться только активные записи регистра!
Практикум №8
Сформировать отчет Материальная ведомость по регистру ОстаткиНоменклатуры. Отчет должен показывать данные по выбираемым на диалоге товарам в любом, выбранном пользователем интервале, дат и с разворотом по регистратору. В качестве данных должны выступать НачальныйОстаток, Приход, Расход, КонечныиОстаток по ресурсу Количество.
39
Конфигурирование в системе " 1С:Предприятие 8.0". Решение оперативных задач
40
3. Технологии проведения документов
3.1. Обусловленное провед ние
До сих пор с проведением документов мы сталкивались лишь как со способом записать движения в регистр. Причем в регистр информация вносилась непосредственно из документа.
Но кроме такой безусловной записи будет встречаться масса задач, когда:
Разберем сейчас простейший случай такого обусловленного проведения.
Необходимо проводить расходную накладную только в том случае, если товара на складе хватает (количество в регистре Остатки номенклатуры больше, чем количество в документе).
При проведении расходной накладной необходимо списывать по регистру ОстаткиНоменклатуры себестоимость, вычисленную средневзвешенным способом. То есть, если в остатке на складе (в регистре) лежит 10 яблок на сумму 20 рублей, то при продаже 2 яблок надо списать:
(20/10) *2 = 4 рубля.
Как видите, для формирования движения по регистру ОстаткиНоменклатуры по каждому Товару документа нам надо будет знать:
Номенклатура| КоличествоДок| КоличествоОстРег] СуммаОстРег
Для оптимизации проведения документа желательно было бы все эти данные собрать сразу в единую таблицу Вот тут нам и поможет запрос.
Итак, процедура проведения расходной накладной:
Процедура ОбработкаПроведения(Отказ, Режим) Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ
//1
41
Конфигурирование в системе " 1С:Предприятие 8.0". Решение оперативных задач
|ИЗ
Накл. Номенклатура КАК Номенклатура, Ост.КоличествоОстаток КАК КолОст, Ост.СуммаОстаток КАК СуммаОст, Накл.Количество КАК КолДок, Накл.Сумма КАК СуммаДок
(ВЫБРАТЬ
Док.Номенклатура КАК Номенклатура, СУММА(Док.Количество) КАК Количество, СУММА(Док.Сумма) КАК Сумма
ИЗ
Документ. Расходная. Товары КАК Док
ГДЕ
Док.Ссылка = ПарСсылка
СГРУППИРОВАТЬ ПО -
Док.Номенклатура) КАК Накл ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ
РегистрНакопления.ОстаткиНоменклатуры.Остатки(Момент, Номенклатура В (ВЫБРАТЬ РАЗЛИЧНЫЕ -
Док. Номенклатура ИЗ
Документ.Расходная.Товары Док ГДЕ
Док.Ссылка = ПарСсылка)
) КАК Ост
ПО
Накл. Номенклатура = Ост. Номенклатура"
I;
Запрос.УстановитьПараметр("ПарСсылка", Ссылка); Запрос.УстановитьПараметрС'Момент", МоментВремениО);
Результат = Запрос. Выполнить^); ВыборкаТоваров = Результат. В ыбрать(); Пока ВыборкаТоваров.СледующийО Цикл
//Контроль нехватки
Остаток = ?(ВыборкаТоваров.КолОст=Null , 0, ВыборкаТоваров.КолОст);
КолДок = ?( ВыборкаТоваров.КолДок = Null, 0, ВыборкаТоваров.КолДок);
//2
//3
//4
Технологии проведения документов
СуммаДок = ?( ВыборкаТоваров.СуммаДок = Null. О, ВыборкаТоваров.СуммаДок);
Нехватка = КолДок - Остаток; Если Нехватка0 Тогда

Сообщить("Нехватка товара " + СокрЛП(ВыбоXкаТоваров.Номенклатура) + "; " + Нехватка);
Сообщить("Расходная " + Номера " от " +Дата-*-" не проводится!"); Отказ = Истина; КонедЕсли;
//Вычисление себестоимости 115
ОстатокСумма = ?( ВыборкаТоваров.СуммаОст = Null, 0, ВыборкаТоваров.СуммаОст); Если КолДок Остаток Тогда
СебестоимостьСп - ОстатокСумма/Остато к* КолДок; иначе
СебестоимостьСп = ОстатокСумма; КонеиЕсли;
//по регистру "ОстаткиНоменклатуры"
Движение = Движения.ОстаткиНоменклатуры.ДобавитьРасход(); Движение.Период = Дата; Движение.Регистратор = Ссылка;
Движение.Номенклатура = Выбор каТоваров. Номенклатура; Движение.Количество = КолДок; Движение. Сумма = СебестоимостьСп; //по регистру "Продажи" Движение = Движения. Продажи.Добавить(); Движение.Период = Дата; Движение.Регистратор = Ссылка;
Движение.Номенклатура = ВыборкаТоваров.Номенклатура; Движение.Контрагент = Контрагент; Движение.Количество = КолДок; Движение. Сумма = СуммаДок; КонецЦикла;
// по регистру "Задолженности"
Движение = Движения.Задолженности.ДобавитьПриходО; Движение.Период ~ Дата; Движение. Регистратор = Ссылка; Движение.Контрагент = Контрагент; Движение.Долг = СуммаДокумента;
//6
43
Конфигурирование в системе "1С:Предприятие 8.0". Решение оперативных задач
Движения. ОстаткиНоменклатуры.ЗаписатьО; Движения .Продажи. Записать(); Движения .Задолженности. ЗаписатьО;
КонецПроцедуры
Комментарий к тексту процедуры:
//1 В тексте запроса указываем, какие выходные данные нас будут интересовать. А получаем их - применив левое внешнее соединение данных табличной части текущего документа и таблицы получения остатков регистра ОстаткиНоменклатуры. То есть, если даже какого-то товара из документа на складе не будет - он, тем более, должен попасть в выходную таблицу.
Кроме того, обратите внимание - в запросе использована два вложенных запроса.
Первый - осуществляет группировку данных из таличной части товары данного документа по номенклатуре. Это сделано для решения проблемы дублей строк. В противном случае при повторах товаров в табличной части документа можем при проведении списать товара больше, чем есть на складе.
Второй - формирует перечень неповторяющихся номенклатурных позиций из табличной части нашего документа для применения в качестве параметра фильтрации присоединяемых из регистра данных.
//2 Заполняем значения параметров запроса. Во-первых, надо было выбирать только те товарные позиции, что присутствовали в текущем документе.
Для того, чтобы применить этот фильтр по таблице расходных накладных - мы указываем, что надо выбирать записи, касающиеся только текущей Ссылки (то есть этого документа).
Во-вторых, поскольку при проведении документа нас должны
интересовать не произвольные остатки номенклатуры, а взятые именно на момент проведения документа, то мы и берем данные на момент времени этого документа.
//3 Выполняем запрос, организуем цикл обхода записей его результата.
//4 Определяем, хватит или не хватит количества на складе для формирования движения по данной строке выходной таблицы запроса (для конкретного товара).
Здесь хотелось бы обратить внимание на несколько вещей.
Первое - если в регистре товара вообще не будет, то выходная таблица будет содержать в поле КолОст значение NULL, а это
44
Технологии проведения документов
совсем не одно и то же, что арифметический О. С ним нельзя производить арифметические действия, например. Поэтому приводим переменную Остаток в этом случае к О. Аналогично поступаем со всеми подобными данными.
Второе, если мы убедились, что товара не хватает по какой-то из позиций, необходимо отменить проведение всего документа. Это легко достигается присвоением параметру процедуры (посмотрите на заголовок процедуры) Отказ значения Истина. Причем ход выполнения данной процедуры тут не прерывается. То есть цикл по выходной таблице запроса будет крутиться и дальше, хотя уже ясно, что свое предназначение процедура не выполнит. Однако это может оказаться удобным. Поскольку мы не просто отменяем проведение документа, но и предупреждаем - из-за каких товаров. В результате в окне сообщений будет информация не по одной товарной позиции, а по всем случаям нехватки.
Третье, если мы программно отказываемся проводить какой-то документ, обязательно надо сообщить пользователю не только -почему, но и какой именно документ не проводим! Иначе при групповом проведении документов пользователь никогда в жизни не догадается, с каким из документов проблема.
//5 Вычисляем себестоимость списания. Поскольку при средневзвешенном способе мы пользуемся пропорцией, а пропорция -это всегда операция деления. А деление - это всегда угроза погрешностей (и деления на ноль). Лучше подстраховаться, и для случая, когда списывается все количество из регистра - вдогонку списать всю оставшуюся себестоимость.
//6 Все данные, необходимые для проведения, получены и рассчитаны - формируем движения по нужным регистрам.
3.2. Оперативное и неоперативное проведение
Программа учета или управления практически всегда отражает реальность той предметной области, для которой она реализована. И, как мы уже обсуждали во введении, программа должна фиксировать, регистрировать, запоминать те события из реальности, которые оказывают влияние на контролируемые показатели. А вот при регистрации событий всегда приходится сталкиваться с понятием времени.
Итак, для любого реального объекта существует три Wонятия времени Прошлое, Настоящее и Будущее. Понятий-то три, но на самом деле ...
Будущее еще не наступило, и говорить о нем серьезно могут только люди с богатым воображением. Прошлое уже прошло, кончилось, не существует. И утверждать, что можно реально вернуться в него -могут только люди с еще более богатым воображением.
45
Конфигурирование в системе " 1С:Предприятие 8.0 ". Решение оперативных задач
Фактически получается, что для реальности существует только Настоящее. То есть реальные события происходят именно в реальном времени.
И идеальная система учета, как отображение реальности, стремится фиксировать события в момент их происхождения - то есть, в реальном времени.
Именно поэтому в системе 1С:Предприятие 8.0 существует системное перечисление РежимПроведенияДокумента, и когда документ проводится реальным временем - параметр процедуры ОбработкаПроведенияО Режим для данного документа устанавливается в положение Оперативный.
Однако построить идеальную систему учета - недостижимая мечта. И дело тут не в том, кто ее создает, а в том, кто ее обслуживает. Ситуация, когда ВСЕ события вносятся в систему в момент их происхождения - как правило, нереальна из-за человеческого фактора, из-за недостаточности данных, из-за... да еще полсотни причин можно привести.
Так вот, в случае если документ проводится не реальным временем (а чтобы понять это - системе достаточно сравнить моменты времени текущего документа и самого последнего на временной оси) -параметр Режим устанавливается для него в положение Неоперативный. Есть вариант, когда система задает вопрос пользователю - в каком режиме провести документ. Если дата документа совпадает с системной, то при выборе Оперативного режима система еще изменит дату документа (а именно - время в дате) на текущий момент.
Для чего же можно использовать значение этого параметра при проведении документа?
Это зависит уже от разработчика конфигурации и постановщика задачи.
В нашей с вами задаче воспользуемся этим параметром вот для чего:
По умолчанию выполнение запроса по любому объекту происходит в режиме чтения данных. То есть, считывая данные с регистра ОстаткиНоменклатуры, мы совершенно не мешаем другим процессам обращаться к регистру.
При клиент-серверном варианте использования программы может оказаться такая ситуация, что пока мы проводим длинную расходную накладную, в ту же долю секунды кто-то тоже проводит свой документ. Мы видим при проведении что на складе 10 апельсинов, и наш коллега видит тоже 10 апельсинов.
В результате получиZся, что или он или мы при проведении
опирались на данные устаревшего снимка регистра
ОстаткиНоменклатуры.
46
Технологии проведения документов
Вероятность такой ситуации достаточно велика при проведении реальным временем, ведь как мы уже разбирались - в основном события стремятся вносить в момент их происхождения. И крайне мала - при работе задним числом. Если и надо подправить какие-то данные прошлого, то, как правило. - это единичные случаи.
Поэтому внесем изменения в проведение расходной накладной, позволяющие блокировать от чтения и изменения другими процессами считываемые в запросе данные из таблицы получения остатков регистра ОстаткиНоменклатуры именно при оперативном проведении.
Добавьте в тело процедуры ОбработкаПроведения() между текстом запроса и строками, в которых устанавливаются для него параметры следующий кусочек:
Если Режим = РежимПроведенияДокумента.Оперативный Тогда Запрос.Текст = Запрос.Текст +"
|ДЛЯ ИЗМЕНЕНИЯ
РегистрНакопления.ОстаткиНоменклатуры.Остатки
КонецЕсли;
Все, проблема - решена!
Практикум №9
При проведении документа мало контролировать только остатки товаров в регистре ОстаткиНоменклатуры, необходимо еще учесть и данные регистра БлокировкаТовара! Необходимо к выходной таблице запроса добавить поле КоличествоЗаблокированного, заполнив его данными по нужным товарам из регистра БлокировкаТовара. И при определении возможности проведения документа это количество, естественно, должно увеличивать нехватку. Маленькое, но важное замечание — весь этот учет заблокированного товара сделайте, пожалуйста, только при оперативном проведении.
3.3. Возможные коллизии при проведении документов и борьба с ними. Объект Последовательности
Пока документы проводятся оперативно - наша система будет работать как часы. Если товар есть - расходная накладная проводится. Если товара нет - не проводится...
Но рассмотрим ситуацию:
47
Конфигурирование в системе "1С: Предприятие 8.0". Решение оперативных задач
1 января - купили 10 яблок; 3 марта - продали 2 яблока.
Если проводить расходную накладную 4 марта - сколько яблок можем продать? Правильно - четыре!
А если ... 4 января?
По данным программы, в тот день на складе было 10 яблок. Значит, все 10 и могли быть тогда проданы! И будьте уверены, если Ваш пользователь может продать 10 яблок задним числом, - он таки обязательно это сделает!
Кстати, если Вас ничего не смутило двумя абзацами выше, прежде чем приступать к освоению материала этой главы - лучше отдохните, а потом настройтесь на работу. 10-2 =8 , а не 4. Тем, кто подвох заметил - самая искренняя признательность за внимательность.
Продолжим. Принципиально то, что, проводя что-то задним числом, т.е. в прошлом, пользователь легко может нарушить логику формирования и проведения последующих документов.
Фактически эта тема - тема Путешествий во времени. И обыграна она во многих фантастических произведениях. Основная мысль сводится к следующему: если слетать в прошлое и не дать своей бабушке встретиться со своим дедушкой, то: непонятно, откуда взялся ты, если ты останешься; а если исчезнешь, то непонятно, кто тогда не даст встретиться бабушке с дедушкой?
Выход из коллизии обычно заключается в сохранении только одного из варианта миров - либо того, где никогда не встречались бабушка с дедушкой, и возмутитель спокойствия на свет не появлялся. Либо тот, где возмутитель появлялся, но не мешал своим родственникам, а еще лучше - вообще задним числом ничего не делал.
Пользователи в своих базах иногда порождают коллизии и более навороченные. Самое милое дело - удалить задним числом приход товара, который чуть позже весь был израсходован.
Так вот, существует специальный объект, предназначенный для обеспечения проведения определенных документов в строгой хронологической последовательности. Он так и называется Последовательности.
Если проводилось несколько документов задним числом, и документы меняли данные в критичном к логике учета в системе регистре (регистрах), то коллизий следует ожидать уже с момента времени самого раннего (по положению в последовательности) такого документа. Именно на него системой автоматически устанавливается граница последовательности (ГП). Проведет пользователь еще более старый документ - ГП на него переустановится.
48
Технологии проведения документов
Чтобы исправить ситуацию, достаточно будет потом перепровести все документы, входящие в последовательность, начиная от момента ГП по настоящее (можно по рабочую дату, а можно по любую другую). Этим занимается специальная системная функция. При таком перепроведении, если правильно написаны процедуры ОбработкаПроведенияО, система будет все перерасчитывать, и при нехватке товара - сообщать пользователям, не давать проводить некорректные документы и т.д. Зато по окончании обработки останется в Вашей базе полностью отлаженный, логически целостный вариант последовательности документов.
Для того, чтобы и в нашей конфигурации автоматически отслеживалась последовательность товарных документов, вернемся к последовательности Торговая, созданной при прохождении прошлого курса Введение в конфигурирование...

В качестве Движений, влияющих на последовательность выбираем регистры, критичные к логике учета: ОстаткиТоваров и БлокировкаТовара. Именно при изменении их данных возможны нарушения последовательности документов.
В качестве документов, которые надо будет перепроводить для восстановления последовательности, указываем документы, которые:
а) выполняют при проведении движения по данным регистрам;
б) при этом имеют обусловленный тип проведения. То есть при
проведении используют не только собственные данные, но и
опираются на данные регистров.
Данные условия должны выполняться одновременно. Им соответствует только документ Расходная. Дело в том, что безусловно проводимая Приходная сможет только подтвердить свои же прежние движения. А зачем на это время тратить?
ЛС\
Конфигурирование в системе "1С:Предприятие 8.0 ". Решение оперативных задач
На закладке данные проверим наличие измерения Номенклатура, тип СправочникСсылка.Номенклатура.

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

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