
- •Т.А. Меркулова «Разработка управляемого приложения на платформе 1с:Предприятие 8»
- •Олавление
- •4.10. Варианты заданий…….…………………………………………………………………66
- •5.6. Варианты заданий………………………………………………………………………...93
- •Глава 6. Запросы
- •6.3. Варианты заданий………………………………………………………………………108
- •7.5. Варианты заданий………………………………………………………………………130
- •8.8. Варианты заданий………………………………………………………………………163
- •9.3. Варианты заданий……………………………………………………………………….176
- •10.5. Варианты заданий……………………………………………………………………..203
- •11.7. Варианты заданий…………………………………………………………………….226
- •12.4. Варианты заданий……………………………………………………………………..245
- •13.5. Варианты заданий……………………………………………………………………..267
- •14.2. Пример формирования отчета………………………………………………………….275
- •14.3. Варианты заданий……………………………………………………………………..281
- •15.4. Варианты заданий……………………………………………………………………….
- •Глава 1. Концепция управляемого приложения
- •1.1. Основные сферы использования управляемого приложения
- •1.2. Основные особенности работы управляемого приложения
- •То для извлечения значения коэффициента необходимо обратиться к бд. А раз так, то за коэффициентом теперь уже придется "идти" на сервер.
- •1.3. Новая стратегия разработки прикладного решения
- •Процедура создания новой информационной базы (иб) в режиме уп
- •Глава 2. Подсистемы в режиме управляемого приложения
- •2.1. Подсистемы – основа командного интерфейса управляемого приложения
- •2.2. Пользователи, роли и панель разделов
- •3.1. Константы
- •Форма констант
- •3.2. Основы клиент-серверного программирования
- •3.3. Общие реквизиты
- •Глава 4. Справочники
- •4.1. Окно редактирования справочника
- •4.2. Разработка формы справочника
- •4.3. Клиентские методы в модуле формы
- •4.4. Объект СообщениеПользователю
- •4.5. Настройка командного интерфейса для ускорения доступа к справочнику
- •4.6. Иерархические справочники
- •4.8. Программная работа со справочниками
- •4.9. Модуль менеджера
- •4.9. Варианты заданий
- •1. Константа «Главный бухгалтер», тип СправочникСсылка.Сотрудники
- •2. Справочник основных средств (ос):
- •3. Справочник материально-ответственных лиц (подчиненный):
- •1. Константа «Директор», тип СправочникСсылка.Сотрудники
- •2. Справочник товаров:
- •3. Справочник цен товаров (подчиненный):
- •1. Константа «Главный бухгалтер», тип СправочникСсылка.Сотрудники
- •2 Справочник сотрудников:
- •3 Справочник стандартных вычетов сотрудника (подчиненный):
- •1. Константа «Главный контрагент», тип СправочникСсылка.Контрагенты
- •2. Справочник контрагентов:
- •3. Справочник расчетных счетов контрагента(подчиненный)
- •1. Константа «Основное транспортное средство директора», тип СправочникСсылка.ТранспортныеСредстваПредприятия
- •2. Справочник ТранспортныеСредстваПредприятия
- •3. Справочник товарно-транспортных накладных (подчиненный)
- •1. Константа «Название предприятия », тип «Строка”
- •2. Справочник персональных компьютеров предприятия
- •3. Справочник сотрудников, работающих на данном компьютере (подчиненный)
- •1. Константа «Название библиотеки », тип «Строка”
- •2. Справочник библиографических единиц:
- •3. Справочник сотрудников, бравших данную единицу с абонемента (подчиненный)
- •1. Константа «Название университета », тип «Строка”
- •2. Справочник факультетов университета:
- •3. Справочник сотрудников- заместителей декана факультета (подчиненный)
- •1. Константа «Название университета », тип «Строка”
- •2/ Справочник кафедр вуЗа:
- •3. Справочник лабораторий кафедры (подчиненный)
- •1. Константа «Название предприятия », тип «Строка”
- •3. Справочник детей работника (подчиненный)
- •1. Константа «Форма оплаты труда предприятия », тип «Строка”
- •2. Справочник «Виды оплат и удержаний»
- •3. Справочник работников, которым назначен данный вид расчета (подчиненный)
- •1. Константа «фио главбуха », тип «Строка”
- •2. Справочник «Парк машин»
- •1. Константа «Директор », тип «СправчникСсылка.Сотрудники”
- •2. Справочник сотрудников:
- •3. Трудовая книжка сотрудника (Подчиненный)
- •1. Константа «Основной объект предприятия », тип «СправочникСсылка.Объекты”
- •2. Справочник видов работ
- •3. Справочник сотрудников, выполняемых данный вид работ (подчиненный)
- •1. Константа «Главный склад предприятия », тип «СправочникСсылка.Склады”
- •2. Справочник складов
- •3. Справочник товарно-материальных ценностей склада (подчиненный)
- •1. Константа «Начальник автотранспортного цеха », тип «СправочникСсылка.Сотрудники”
- •2. Справочник норм расхода масел ,смазок и доп. Топлива
- •3. Справочник водителей автомобиля (подсиненный))
- •1. Константа «Название предприятия », тип «Строка”
- •2. Справочник профессий
- •3. Справочник должностных ставок данной профессии(подчиненный)
- •1. Константа «Название университета », тип «Строка”
- •2. Штатное расписание вуЗа
- •3. Справочник сотрудников кафедры (подчиненный)
- •1. Константа «Название предприятия », тип «Строка”
- •2. Справочник характерных видов расчетов подразделений предприятия
- •3. Справочник сотрудников данного подразделения (подчиненный)
- •1. Константа «Наибольший табельный номер (Код) в справочнике сотрудников », тип «Строка”. Означивается автоматически при запуске приложения.
- •2. Справочник сотрудников:
- •3. Справочник кадровых приказов по сотруднику (подчиненный)
- •1. Константа «Название информационной базы », тип «Строка”
- •2. Справочник пользователей
- •Справочник дополнительных свойств пользователя (подчиненный)
- •1. Константа «Основной расчетный счет предприятия », тип «Строка”
- •2. Справочник контрагентов:
- •3. Справочник филиалов контрагента (подчиненный)
- •1. Константа «Основной поставщик предприятия », тип «СправочникСсылка.Контрагенты”
- •2. Справочник товаров:
- •3. Справочник Цены номенклатуры (подчиненный)
- •Глава 5. Отчеты
- •5.1. Макет отчета
- •5.2. Табличный документ
- •5.3. Дополнительные свойства табличного документа
- •5.3.1. Оформление ячеек
- •5.3.2. Группировки
- •5.3.3. Расшифровки
- •5.3.4. Примечания
- •5.4. Сохранение отчетов
- •5.5. Конструктор печати
- •5.6. Варианты заданий
- •Глава 6. Запросы
- •6.1. Табличный способ доступа к данным
- •6.2. Язык запросов
- •6.2.1. Обращение к полям через точку (".")
- •6.2.2. Обращение к вложенным таблицам (табличным частям документов и элементов справочников)
- •6.2.3. Автоматическое упорядочивание
- •6.2.4. Многомерное и многоуровневое формирование итогов
- •6.2.5. Поддержка виртуальных таблиц
- •6.2.6. Стандартные sql операции
- •6.2.10. Пакетные запросы
- •6.2.10А Таблица значений как источник данных для запроса
- •6.2.11. Обработка результатов запроса Получение и проверка результата запроса
- •Выборка из результата запроса
- •6.2.12. Конструкторы запроса
- •Конструктор запроса (Query Builder)
- •Конструктор запроса с обработкой результата
- •6.3. Варианты заданий
- •Глава 7. Документы
- •7.1. Структура документов. Свойства документов
- •7.2. Программная работа с документами
- •7.3. Стандартные реквизиты
- •7.6. Функциональные опции
- •7.5. Варианты заданий
- •Цена товара проставляется автоматически после выбора элемента справочника товаров из соответствующего реквизита данного справочника.
- •Сумма рассчитывается автоматически.
- •Глава 8. Регистры накопления
- •8.1. Назначение регистров накопления
- •8.2. Регистры остатков
- •8.3. Оборотные регистры накопления
- •8.4. Вызов формы регистра накопления из формы документа
- •8.5. Агрегаты
- •8.6. Последовательности
- •8.7. Нумераторы
- •8.8. Варианты заданий
- •Глава 9. Регистры сведений
- •9.1. Назначение. Типы регистров сведений
- •Реквизиты регистра сведений
- •Режим записи
- •9.2. Программная обработка данных из регистра сведений
- •9.3. Варианты заданий
- •Справочник сотрудников:
- •Глава 10. Система компоновки данных
- •Введение
- •Основные составляющие скд
- •10.3. Пример формирования отчета с помощью скд
- •10.4. Расшифровки в скд Стандартная расшифровка
- •Нестандартная расшифровка
- •Разработка ведомости в скд
- •Присоединение ведомости в качестве расшифровки отчета по остаткам
- •10.5. Варианты заданий
- •Глава 11. Разработка средств ведения бухгалтерского учета
- •11.1. Объекты метаданных, относящиеся к бухучету
- •11.2. Планы счетов и регистры бухгалтерии
- •Субсчета
- •Предопределенные счета
- •Корреспонденции
- •11.3. План видов характеристик
- •Предопределенные виды субконто
- •11.4. Приемы программирования
- •11.5. Примеры формирования проводок в модуле документа
- •11.6. Пример решения задачи Разработать документ: «Безвозмездное поступление тмц от организаций»
- •11.7. Варианты заданий
- •Вариант 21 «Выдача спецодежды работникам»
- •Вариант 22 «Списание спецодежды»
- •Предварительно разработать документ «Поступление товаров без ндс» с одной проводкой (по сумме выручки) для каждой строки документа.
- •Предварительно разработать документ «Заявка от покупателя» , не формирующий проводок.
- •Глава 12. Запросы к регистрам бухгалтерии
- •12.1. Регистры- источники данных для запроса
- •12.2. Примеры запросов к регистрам бухгалтерии
- •Структура регистра бухгалтерии
- •Движения без субконто
- •Движения с указанием субконто
- •Остатки по счетам
- •Валютные остатки по счетам
- •Обороты по счетам
- •Обороты между счетами
- •Оборотно-сальдовая ведомость
- •12.3. Пример формирования отчета
- •Проект запроса.
- •12.4. Варианты заданий
- •Ведомость выдачи спецодежды работника за период с____ по_____
- •Ведомость списания спецодежды работника за период с____ по_____
- •Глава 13. Сложные периодические расчеты
- •13.1. Объекты метаданных, используемые в периодических расчетах
- •13.2. Планы видов расчета
- •Предопределенные виды расчета
- •Взаимосвязь видов расчета
- •Предопределенные табличные части плана видов расчета
- •13.3. Регистры расчета
- •Структура регистра расчета
- •Периодичность регистра расчета
- •Связь регистра расчета с планом видов расчета
- •Зависимость записей по базовому периоду
- •График времени
- •Частичное попадание записей регистра расчета в базовый период
- •Перерасчеты
- •13.4. Пример решения задачи расчета заработной платы
- •13.5. Варианты заданий
- •Глава 14. Запросы к регистрам расчета
- •14.1. Таблицы – источники запросов
- •Пример.
- •За период с___по________
- •Ведомость начислений материальной помощи, не облагаемой налогом, с начала года по___________
- •Глава 15. Дополнительные возможности разработки отчетов с использованием системы компоновки данных
- •Внешние макеты
- •Предопределенные макеты
- •15.3. Макеты оформления Работа со стандартными макетами оформления
- •Создание собственного макета оформления
- •15.4. Варианты заданий
- •1. В.А. Ажеронок, а. В. Островерх, м. Г. Радченко, е. Ю. Хрусталева
Глава 8. Регистры накопления
8.1. Назначение регистров накопления
Представим себе организацию, в которой все сведения о приходе материалов хранятся лишь в виде приходных документов. Для того, чтобы узнать количество и стоимость имеющихся в организации материалов, нам понадобится обращаться к документам, просматривать каждый из них, выписывая нужные данные, после чего суммировать их, получая нужные данные. Такой подход неудобен – он слишком медленный как для нашего "ручного" случая, так и для автоматизированного учета.
Логичнее было бы, в дополнение к документам, вести специальные таблицы, в которые, при приеме материалов и при их списании, вносить краткие сведения об этом. Если, скажем, ежедневно, подводить итоги по этим таблицам и выводить остатки материалов, то, для того, чтобы сказать, сколько и каких материалов имеется в организации на определенную дату, достаточно обратиться к соответствующей графе таблицы. В системе 1С:Предприятие такими таблицами являются регистры накопления (РН). Как следует из названия, они предназначены для отражения, накопления, неких показателей. И отражение в регистрах прихода и расхода материалов – один из типичных примеров их использования.
8.2. Регистры остатков
В нашей организации ведется учет материалов в привязке к ответственным лицам, которые их получают и с которых эти материалы списывают при отпуске в производство. Нам нужно хранить информацию о количестве материалов и об их стоимости, а так же, при списании в производство, иметь сведения о том, какому именно мастеру эти материалы переданы. Для хранения движений документов учета движения материалов создадим регистр накопления.
При планировании состава регистра накопления нужно понять, какие именно данные мы собираемся в нем хранить, после чего "разложить" эти данные по измерениям, ресурсам и реквизитам регистра.
Итак, нам нужно хранить следующие данные:
Номенклатурная позиция
Ответственный сотрудник, на котором числится данная позиция
Количество номенклатуры
Стоимость номенклатуры
Данные о мастере, которому переданы материалы для использования.
Измерения регистра, или разрезы, в которых хранятся данные, позволяют нам ответить на вопросы о том, какие именно данные хранятся в регистре. В нашем случае нам нужно знать две основных характеристики – это, за каким ответственным лицом закреплена та или иная номенклатурная позиция. Очевидно, измерениями из нашего списка данных будут номенклатурная позиция и ответственный сотрудник.
Ресурсы регистра – это всегда числовые значения, характеризующие хранимые данные. Числовые значения – это количество и сумма, и именно они будут ресурсами нашего регистра.
Реквизиты регистра играют вспомогательную роль, и, в нашем случае, логично будет в реквизите регистра хранить сведения о мастере, получившем материалы для работы – на тот случай, если нам понадобится узнать – кто именно эти материалы использовал.
Еще один важный вопрос, который нужно решить, проектируя регистр, заключается в том, будет ли этот регистр регистром остатков или регистром оборотов. Нас интересуют и сведения об остатках материалов, и сведения об оборотах, поэтому при настройке регистра следует указать вид регистра – Остатки. Регистр с видом Остатки позволяет нам работать и с остатками и с оборотами
Предложенная здесь структура регистра накопления – это лишь один из вариантов того, как можно организовать хранение описываемых данных. Подобную схему учета можно реализовать, скажем, с помощью пары регистров, один из которых используется исключительно для целей хранения суммовых остатков материалов – то есть, те данные, которые нужны для финансовых отчетов, другой – для хранения данных по центрам ответственности. В любом случае, каждая конкретная схема учета может потребовать и собственной структуры регистров, и наш пример – лишь демонстрация одного из возможных вариантов.
Пример. Создадим новый регистр накопления, назовем его ОстаткиМатериалов, параметр Вид регистра оставим в значении Остатки, Рис. 8.1.
Рис. 8.1. Регистр накопления ОстаткиМатериалов
Включим регистр накопления в состав подсистемы Документы..
На вкладке Данные создадим следующие измерения, ресурсы и реквизиты:
Измерения:
Имя: Номенклатура, Тип: СправочникСсылка.Номенклатура, Запрет незаполненных значений – установлено.
Имя: ОтветственныйСотрудник, Тип: СправочникСсылка.Сотрудники, Запрет незаполненных значений – установлено.
Ресурсы
Имя: Количество, Тип: число, длина 10, точность 3
Имя: Сумма, Тип: число, длина 10, точность 2
Реквизиты:
Имя: ПолучательМатериалов, Тип: СправочникСсылка.Сотрудники
Имена этих реквизитов, их типы, а так же – стандартные реквизиты регистра (рис. 8.2.) – будут использованы при работе над процедурой проведения документа.
Рис. 8.2. Регистр накопления ОстаткиМатериалов, состав данных
Исключим из состава реквизитов регистра общий реквизит Организация. Сейчас в нем нет необходимости. Для организации хранения данных в регистре в разрезе различных организаций нам понадобилось бы новое измерение – Организация, благодаря наличию которого мы смогли бы работать с материалами различных организаций.
Перейдем на вкладку Регистраторы окна редактирования объекта и выберем в качестве документов-регистраторов документы – ПоступлениеМатериалов и ОтпускМатериаловМастеру.
На данном этапе настройка регистра накопления окончена, перейдем к настройкам документов. Начнем с документа ПоступлениеМатериалов.
Откроем окно редактирования объекта для этого документа, перейдем на вкладку Движения (рис. 8.3.) и нажмем на кнопку Конструктор движений
Рис. 8.3. Документ ПоступлениеМатериалов, вкладка Движения
В конструкторе, выберем тип движения регистра – Приход, в поле Табличная часть укажем табличную часть документа Материалы, нажмем на кнопку Заполнить выражения. Автоматический механизм установления соответствия между данными документа и регистра не всегда работает правильно (в том случае, если не может однозначно определить соответствия, или тогда, когда соответствие, определенное им по его логике, отличается от желаемого), поэтому проверим правильность установленных соответствий. В итоге окно Конструктора движения регистра должно выглядеть так, как показано на рис. 8.4.
После нажатия на кнопку ОК, в модуле объекта документа будет сформирована такая процедура обработки проведения (так она выглядит после удаления комментариев о том, что код построен конструктором движений):
Рис. 8.4. Конструктор движений
Процедура ОбработкаПроведения(Отказ, Режим)
// регистр ОстаткиМатериалов Приход
Движения.ОстаткиМатериалов.Записывать = Истина;
Для Каждого ТекСтрокаМатериалы Из Материалы Цикл
Движение = Движения.ОстаткиМатериалов.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.Номенклатура = ТекСтрокаМатериалы.Номенклатура;
Движение.ОтветственныйСотрудник = ОтветственныйСотрудник;
Движение.Количество = ТекСтрокаМатериалы.Количество;
Движение.Сумма = ТекСтрокаМатериалы.Сумма;
КонецЦикла;
КонецПроцедуры
Эта процедура объявлена в модуле объекта, она исполняется на сервере. Установка свойства Движения.ОстаткиМатериалов.Записывать в значение Истина говорит системе о том, что она должна записать в регистр движения, сформированные в процедуре. Движения заполняются в цикле обхода табличной части документа. Они будут физически записаны в регистр после того, как будет сформирован полный набор записей. Процедура проведения вполне может использовать и другие механизмы обращения к данным. Например, нужные данные могут быть получены с помощью запроса.
Так как мы проводим документ, отвечающий за приход товаров, параметр Движение.ВидДвижения устанавливается в значение ВидДвиженияНакопления.Приход. Период устанавливается равным дате документа (мы напрямую работаем с реквизитами документа). Остальные данные заполняются, опять же, либо из реквизитов документа, либо из реквизитов текущей строки табличной части.
Запустим конфигурацию в режиме 1С:Предприятие, проверим работу механизма на практике. Для этого перепроведем существующие документы ПоступлениеМатериалов, можем ввести и новые документы этого вида. При проведении или перепроведении данные из документов попадают в регистр накопления ОстаткиМатериалов, рис. 8.5
Рис. 8.5. Данные в регистре накопления
Замечание. Регистры накопления, как объекты, которые не предназначены изначально для "ручной" работы пользователя, не выводятся в командном интерфейсе даже при указании подсистем, в которые они входят. Нам, при разработке, понадобится просматривать регистры.
Для того, чтобы открыть окно регистра, можно либо воспользоваться командой Главное меню > Все функции и в появившемся окне Все функции найти нужный регистр, либо открывать его с помощью команды в интерфейсе, предварительно самостоятельно добавив эту команду в нужный раздел интерфейса.
При записи данных о приходе материалов нам, в нашем случае, нет нужды в каких-либо дополнительных проверках вводимых данных, поэтому нас вполне устроит стандартная процедура проведения.
Следующим документом, проведение которого мы хотим организовать, является документ, списывающий материалы – ОтпускМатериаловМастеру.
Для начала сформулируем цели, которых мы хотим достичь при проведении данного документа. Если в случае с документом поступления материалов в нашей конфигурации все довольно просто – нам нужно лишь отразить поступление материалов без каких-либо дополнительных проверок или расчетов, то списание материалов даже в нашем, достаточно простом случае, превращается в непростую задачу.
Во-первых, мы хотим, чтобы система не позволяла списать больше материалов, чем числится за конкретным ответственным лицом. Это означает, что перед формированием движений мы должны сверить данные, введенные в табличную часть документа с данными по остаткам материалов, хранящимися в нашей базе, и, в том случае, если материалов нам не хватит – отказаться проводить документ и сообщить пользователю об ошибке.
Во-вторых, списывая материалы, мы должны придерживаться какой-либо политики оценки. Наиболее простая и широко используемая политика – это списание материалов по средней стоимости.
Предположим, мы приняли две партии одного и того же товара – в первой было 10 единиц по 9 рублей единица (общая стоимость 90 рублей), во второй – 20 единиц по 12 рублей единица (общая стоимость 240 рублей). В регистре мы храним общую стоимость материалов и их общее количество. Поэтому, списывая по методу средней стоимости, например, 15 единиц товара, мы сначала должны найти среднюю стоимость единицы имеющихся товаров, разделив их общую стоимость на общее количество – в нашем случае это (90+240)/(10+20)=11 рублей – и умножить полученную стоимость на количество списываемых товаров – то есть, 11*15=165 рублей. Таким образом, мы сможем оценивать стоимость списанных товаров и оценивать стоимость остатков.
Существуют и другие методы списания материальных ценностей, в частности – это ФИФО, ЛИФО. Вполне можно организовать учет каждой единицы материальных ценностей и списание их по индивидуальной себестоимости. Мы реализуем списание материалов по средней стоимости.
Определившись с нашими двумя основными задачами – реализации списания материалов по средней стоимости и контроля остатков, приступим к работе над процедурой для проведения нашего документа.
Перейдем в модуль объекта документа ОтпускМатериаловМастеру, с помощью панели инструментов Модуль создадим процедуру ОбработкаПроведения. Данные из табличной части мы будем получать с помощью запроса – в дальнейшем мы будем развивать этот запрос для получения необходимых сведений об остатках номенклатуры.
В процедуре ОбработкаПроведения документа ОтпускМатериаловМастеру. Процедура пока пуста, щелкнем в ней правой кнопкой мыши и вызовем из контекстного меню команду Конструктор запроса с обработкой результата. В ответ на вопрос конструктора о создании нового запроса, ответим утвердительно, после чего, в окне конструктора нажмем на кнопку Запрос и вставим в пустое поле для текста запроса полученный текст запроса (предварительно нажав на кнопку Редактировать запрос в окне Запрос), рис. 8.6.
Рис.
8.6. Добавление сформированного
текста запроса в конструктор
На закладке Обработка окна Конструктор запроса оставим переключатель Тип обработки в положении Обход результата. После закрытия окна Запрос конструктор автоматически разберет запрос, "разложит" по закладкам своего окна, при необходимости, его можно будет редактировать, пользуясь инструментами, расположенными на этих закладках. Нас запрос устраивает – поэтому мы можем нажимать в окне конструктора ОК и переходить к дальнейшему редактированию кода..
Здесь
нас, в первую очередь, не устраивает
автоматическое заполнение параметров
запроса
Заменим код:
Запрос.УстановитьПараметр("МоментВремени", МоментВремени);
Запрос.УстановитьПараметр("ОтвСотр", ОтвСотр);
На код:
Запрос.УстановитьПараметр("МоментВремени", МоментВремени());
Запрос.УстановитьПараметр("ОтвСотр", ОтветственныйСотрудник);
Здесь мы, во-первых, вызвали метод МоментВремени(), возвращающий момент времени для нашего документа (то есть – для того, в модуле объекта которого мы сейчас работаем). Во-вторых, мы обратились к реквизиту документа ОтветственныйСотрудник для установки параметра ОтвСотр.
Проверим работу созданного механизма, запустив систему в режиме отладки и установив в коде модуля точку останова после получения выборки из результатов запроса. (рис.8.7.)
Рис.
8.7. Анализ результата выполнения
запроса в коде процедуры проведения
документа
Здесь мы выполнили метод Выгрузить() для результата выполнения запроса (переменная Результат), получили таблицу значений, которую можно проанализировать. Результат нас устраивает, поэтому мы принимаемся за дальнейшую работу над процедурой. В итоге у нас получился следующий код:
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ДокМ.Номенклатура,
| СУММА(ДокМ.Количество) КАК Количество,
| МАКСИМУМ(ЕСТЬNULL(ОстМ.КоличествоОстаток, 0)) КАК |КоличествоОстатков,
| МАКСИМУМ(ЕСТЬNULL(ОстМ.СуммаОстаток, 0)) КАК СуммаОстатков
|ИЗ
| Документ.ОтпускМатериаловМастеру.Материалы КАК ДокМ
| ЛЕВОЕ СОЕДИНЕНИЕ |РегистрНакопления.ОстаткиМатериалов.Остатки(&МоментВремени, |ОтветственныйСотрудник = &ОтвСотр) КАК ОстМ
| ПО ДокМ.Номенклатура = ОстМ.Номенклатура
|ГДЕ
| ДокМ.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
| ДокМ.Номенклатура";
Запрос.УстановитьПараметр("МоментВремени", МоментВремени());
Запрос.УстановитьПараметр("ОтвСотр", ОтветственныйСотрудник);
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Результат = Запрос.Выполнить();
ВыборкаДЗ = Результат.Выбрать();
Движения.ОстаткиМатериалов.Записывать=Истина;
Пока ВыборкаДЗ.Следующий() Цикл
Если ВыборкаДЗ.Количество>ВыборкаДЗ.КоличествоОстатков Тогда
Сообщить("Недостаточное количество товара "+ВыборкаДЗ.Номенклатура
+", необходимо "+ВыборкаДЗ.Количество+", в наличии "
+ВыборкаДЗ.КоличествоОстатков);
Отказ=Истина;
Движения.ОстаткиМатериалов.Записывать=Ложь;
КонецЕсли;
Если Отказ Тогда
Продолжить;
КонецЕсли;
Движение=Движения.ОстаткиМатериалов.Добавить();
Движение.ВидДвижения=ВидДвиженияНакопления.Расход;
Движение.Период=Дата;
Движение.Номенклатура=ВыборкаДЗ.Номенклатура;
Движение.Количество=ВыборкаДЗ.Количество;
Движение.Сумма=ВыборкаДЗ.Количество*ВыборкаДЗ.СуммаОстатков/ВыборкаДЗ.КоличествоОстатков;
Движение.ОтветственныйСотрудник=ОтветственныйСотрудник;
Движение.ПолучательМатериалов=ПолучательМатериалов;
КонецЦикла;
КонецПроцедуры
Сначала мы сравнили требуемое и реальное количество материалов. Если нужно больше, чем имеется за конкретным ответственным лицом, мы формируем сообщение для пользователя, устанавливаем параметр Отказ в значение Истина (то есть указываем системе на то, что документ мы проводить не будем), и отключаем запись данных в регистр накопления. После проверки количества мы выполняем еще одну проверку – на состояние переменной Отказ. Если эта переменная установлена в значение Истина – мы переходим к следующей итерации цикла, не выполняя оставшиеся команды. Если же Отказ установлен в значение Ложь, мы формируем запись по регистру ОстаткиМатериалов с использованием текущих данных. Обратите внимание на то, как рассчитывается поле Сумма – для его получения мы умножаем количество материалов, которые нужно списать, на результат деления общей суммы остатков материалов на общее количество остатков.
Проверим результаты работы нашего кода в режиме 1С:Предприятие. Если документ верно реагирует на попытку списания материалов, количество которых превышает имеющееся, и если анализ состава регистра накопления после проведения показывает, что списано нужное количество материалов и их стоимость определена верно – можно считать, что мы справились с поставленной задачей.