
- •Т.А. Меркулова «Разработка управляемого приложения на платформе 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.3. Оборотные регистры накопления
Выше мы работали с регистром накопления, основной задачей которого было – предоставление данных об остатках материалов. Приходные данные в этот регистр попадали при поступлении материалов в организацию, они были "привязаны" к определенному ответственному лицу. Расходные данные в регистр вносились тогда, когда материалы отпускались мастеру для производственных целей.
Организация, работу которой мы автоматизируем, помимо контроля остатков материалов на складе, хотела бы организовать учет продажи материалов и учет оказания услуг с возможностью подсчета прибыли от этих операций. Для нахождения показателя прибыли, например, при продаже материалов, нам достаточно знать себестоимость этих материалов и продажную цену. Для нахождения показателя прибыли по оказанным услугам, мы должны, во-первых, знать стоимость оказанных услуг, во-вторых – знать показатель их себестоимости. Показатели себестоимости обычно включают в себя множество данных – заработную плату сотрудников, амортизацию основных средств, общехозяйственные и общепроизводственные расходы (арендную плату, например). Мы упростим задачу, решив, что себестоимость услуг заключается в себестоимости материалов, израсходованных на оказание этих услуг. Данные по прибыли от продаж нам хотелось бы получать ежедневно, а данные по прибыли от оказания услуг – ежемесячно.
Подобные результирующие показатели в реальной системе учета могут, например, влиять на заработную плату сотрудников. К тому же, анализ таких показателей в разрезе контрагентов, которым проданы материалы или которым оказаны услуги, поможет выделить среди контрагентов тех, кто приносит организации наибольшую прибыль, а, значит, может нуждаться в особом внимании.
Для реализации этих задач нам, во-первых, понадобится документ (или документы), для фиксации в системе продаж материалов и оказания услуг, а, во-вторых – объекты для хранения сведений о проданных материалах, их себестоимости, об оказанных услугах и о материалах, которые были затрачены на оказание этих услуг.
В осуществлении этого замысла нам помогут оборотные регистры накопления. Конечно, показатели оборотов мы можем получать и сейчас, так как регистр с видом Остатки хранит и остатки, и обороты, но, если показатель остатков нам не важен (например, нам нет смысла считать "остатки" по количеству оказанных услуг), предпочтительнее будет использовать регистр с видом Обороты. Частота получения данных из регистра так же имеет значение, так как оборотные регистры накопления поддерживают механизм агрегатов, который позволяет ускорить получение данных за определенные периоды, по определенному набору измерений (разрезов) регистра.
Здесь мы ограничимся разработкой документа реализации материалов и созданием оборотного регистра накопления для хранения данных по реализации и последующего построения на его основе отчетов.
Создадим документ РеализацияМатериалов. Добавим его в состав подсистемы Документы. Запретим оперативное проведение документа.
В состав данных документа включим следующие реквизиты:
Имя: Покупатель: Тип: СправочникСсылка.Контрагенты
Имя: ОтветственныйСотрудник: Тип: СправочникСсылка.Сотрудники
Добавим в документ табличную часть Материалы со следующими реквизитами:
Имя: Номенклатура, Тип: СправочникСсылка.Номенклатура
Имя: Остаток, Тип: Число, Длина 10, точность 3
Имя: Себестоимость, Тип: Число, длина 10, точность 2
Имя: Количество, Тип: Число, длина 10, точность 3
Имя: ЦенаПродажи, Тип: Число, длина 10, точность 2
Имя: Выручка, тип: Число, длина 10, точность 2
Теперь займемся формой документа. Нам хотелось бы реализовать следующую функциональность – при заполненной данными о номенклатуре табличной части, по нажатию на кнопку РассчитатьСебестоимостьИОстатки, заполнять сведения о себестоимости материалов и об их остатках по выбранному ответственному сотруднику, исходя из данных, хранящихся в регистре накопления ОстаткиМатериалов.
Создадим форму документа, добавим команду формы РассчитатьСебестоимостьИОстатки и переместим ее на командную панель табличного поля, рис. 8.8.
Рис. 8.8. Конструирование формы документа РеализацияМатериалов
В полях Остаток и Себестоимость пользователь должен увидеть текущие сведения об остатках и себестоимости выбранной номенклатуры, которая числится за выбранным в реквизите документа ответственным лицом. Эти поля должны быть недоступны для редактирования, так как играют лишь вспомогательную, информационную функцию. Для этого у полей МатериалыОстаток и МатериалыСебестоимость установим свойство ТолькоПросмотр, рис. 8.9.
Рис.
8.9. Запрет редактирования поля
пользователем
Теперь займемся кодом, отвечающим за получение данных по остаткам и себестоимости материалов, которые находятся в табличной части. Действия по получению данных и по заполнению ими табличного поля мы должны выполнять на сервере, для этого создадим серверную процедуру РассчитатьНаСервере() и вызовем ее из процедуры обработчика РассчитатьСебестоимостьИОстатки().
Для того, чтобы получить нужные данные, нам понадобится запрос, который выбирает данные из табличной части и из регистра накопления ОстаткиМатериалов, сгруппировав их по номенклатуре. Воспользуемся уже знакомой вам консолью запросов для того, чтобы построить подобный запрос. Здесь следует вспомнить, что, конструируя процедуру проведения документа ОтпускМатериаловМастеру, мы строили подобный запрос. Поэтому сейчас мы можем просто этот запрос доработать. Дорабатывать его, однако, удобно с помощью консоли запросов. Перенесем текст запроса из кода метода ОбработкаПроведения документа ОтпускМатериаловМастеру, добавим в поле текста запроса консоли запросов в режиме 1С:Предприятие и займемся редактированием текста.
Мы начинаем с такого текста запроса:
ВЫБРАТЬ
ДокМ.Номенклатура,
СУММА(ДокМ.Количество) КАК Количество,
МАКСИМУМ(ЕСТЬNULL(ОстМ.КоличествоОстаток, 0)) КАК КоличествоОстатков,
МАКСИМУМ(ЕСТЬNULL(ОстМ.СуммаОстаток, 0)) КАК СуммаОстатков
ИЗ
Документ.ОтпускМатериаловМастеру.Материалы КАК ДокМ
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиМатериалов.Остатки(&МоментВремени, ОтветственныйСотрудник = &ОтвСотр) КАК ОстМ
ПО ДокМ.Номенклатура = ОстМ.Номенклатура
ГДЕ
ДокМ.Ссылка = &Ссылка
СГРУППИРОВАТЬ ПО
ДокМ.Номенклатура
В этом запросе нам понадобится откорректировать обращение к таблице документа, который содержит нужные данные. Предполагая, что пользователь может ввести одну и ту же номенклатурную позицию несколькими строками, возможно, собираясь особым образом задать цену продажи для одной и той же позиции, мы не будем группировать запрос по номенклатуре. Мы получим из таблицы все данные, которые мог ввести пользователь – позже мы используем эти данные для заполнения табличного поля.
Займемся теперь кодом модуля РассчитатьНаСервере(). Воспользуемся конструктором запросов с обработкой результата. В итоге задачу заполнения табличной части данными мы решили следующим образом:
&НаКлиенте
Процедура РассчитатьСебестоимостьИОстатки(Команда)
Режим=РежимДиалогаВопрос.ДаНет;
Ответ=Вопрос("Для продолжения нужно записать документ. Сделать это?",Режим,0);
Если Ответ=КодВозвратаДиалога.Да Тогда
Записать();
РассчитатьНаСервере();
Предупреждение("Табличная часть заполнена");
Иначе
Предупреждение("Табличная часть не заполнена");
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура РассчитатьНаСервере()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ДокМ.Номенклатура,
| ЕСТЬNULL(ОстМ.КоличествоОстаток, 0) КАК КоличествоОстатков,
| ЕСТЬNULL(ОстМ.СуммаОстаток, 0) КАК СуммаОстатков,
| ДокМ.Количество,
| ДокМ.ЦенаПродажи,
| ДокМ.Выручка
|ИЗ
| Документ.РеализацияМатериалов.Материалы КАК ДокМ
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиМатериалов.Остатки(&МоментВремени, ОтветственныйСотрудник = &ОтвСотр) КАК ОстМ
| ПО ДокМ.Номенклатура = ОстМ.Номенклатура
|ГДЕ
| ДокМ.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("МоментВремени", Объект.Ссылка.МоментВремени());
Запрос.УстановитьПараметр("ОтвСотр", Объект.ОтветственныйСотрудник);
Запрос.УстановитьПараметр("Ссылка", Объект.Ссылка);
Результат = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Объект.Материалы.Очистить();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
СтрокаТЧ=Объект.Материалы.Добавить();
СтрокаТЧ.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура;
Если НЕ ВыборкаДетальныеЗаписи.КоличествоОстатков=0 Тогда
СтрокаТЧ.Себестоимость=ВыборкаДетальныеЗаписи.СуммаОстатков/
ВыборкаДетальныеЗаписи.КоличествоОстатков;
КонецЕсли;
СтрокаТЧ.Остаток=ВыборкаДетальныеЗаписи.КоличествоОстатков;
СтрокаТЧ.Количество=ВыборкаДетальныеЗаписи.Количество;
СтрокаТЧ.ЦенаПродажи=ВыборкаДетальныеЗаписи.ЦенаПродажи;
СтрокаТЧ.Выручка=ВыборкаДетальныеЗаписи.Выручка;
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура РассчитатьСумму()
ТекущаяСтрока=Элементы.Материалы.ТекущиеДанные;
ТекущаяСтрока.Выручка=ТекущаяСтрока.Количество*ТекущаяСтрока.ЦенаПродажи;
КонецПроцедуры
&НаКлиенте
Процедура МатериалыКоличествоПриИзменении(Элемент)
РассчитатьСумму();
КонецПроцедуры
&НаКлиенте
Процедура МатериалыЦенаПродажиПриИзменении(Элемент)
РассчитатьСумму();
КонецПроцедуры
В методе, работающем на клиенте, мы, сразу после запуска, сообщаем пользователю о том, что для правильной работы системы нужно сначала записать документ. Если он отвечает утвердительно – записываем документ и вызываем серверную процедуру. Для задавания подобных вопросов в виде диалоговых окон с кнопками-вариантами вопроса (8.10.), используется метод Вопрос().
Рис.
8.10. Вопрос пользователю
В серверной процедуре мы выбираем с помощью запроса данные из табличной части нашего документа и из регистра ОстаткиМатериалов. Когда данные получены, мы просто очищаем табличную часть и заполняем ее снова, теперь уже с использованием новых данных.
В итоге, после того, как пользователь заполнил табличную часть документа и нажал на кнопку Рассчитать себестоимость и остатки, он получит примерно следующее, 8.11.
Рис.
8.11. Результат автоматического
заполнения табличной части
Поля Остаток и Себестоимость в данном случае играют лишь вспомогательную роль, позволяя пользователю сразу, при заполнении документа, понять, каково состояние дел с остатками материалов.
Форму документа, да и процедуру заполнения, можно дорабатывать и оптимизировать, но свои основные функции они выполняют, поэтому теперь займемся конструированием оборотного регистра накопления, в котором мы собираемся хранить сведения о продажах. А именно, нас интересуют данные о номенклатуре, о контрагенте, об ответственном лице, продавшем материалы, о количестве, себестоимости и цене материалов.
Создадим новый регистр накопления, назовем его Продажи. Вид регистра установим в значение Обороты, рис. 8.12. Включим его в состав подсистемы Документы.
Рис.
8.12. Создание регистра накопления
В состав данных регистра (рис. 8.13.) внесем следующие поля:
Измерения:
Имя: Контрагент, тип: СправочникСсылка.Контрагенты
Имя: ОтветственныйСотрудник, тип: СправочникСсылка.Сотрудники
Имя: Номенклатура, тип: СправочникСсылка.Номенклатура
Ресурсы:
Имя: Себестоимость, тип: Число, длина 10, точность 2
Имя: Количество, тип: Число, длина 10, точность 3
Имя: Выручка, тип: Число, длина 10, точность 2
Рис.
8.13. Настройка данных регистра накопления
В качестве регистратора для данного регистра выберем документ РеализацияМатериалов.
Теперь займемся проведением этого документа. Он должен формировать движения по двум регистрам – по регистру ОстаткиМатериалов, и по регистру Продажи.
Добавим в модуль объекта документа процедуру ОбработкаПроведения. При конструировании этой процедуры мы можем воспользоваться уже отработанными при проведении документа ОтпускМатериаловМастеру механизмами.
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ДокМ.Номенклатура,
| СУММА(ДокМ.Количество) КАК Количество,
| СУММА(ДокМ.Выручка) КАК Выручка,
| МАКСИМУМ(ЕСТЬNULL(ОстМ.КоличествоОстаток, 0)) КАК КоличествоОстатков,
| МАКСИМУМ(ЕСТЬNULL(ОстМ.СуммаОстаток, 0)) КАК СуммаОстатков
|ИЗ
| Документ.РеализацияМатериалов.Материалы КАК ДокМ
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиМатериалов.Остатки(&МоментВремени, ОтветственныйСотрудник = &ОтвСотр) КАК ОстМ
| ПО ДокМ.Номенклатура = ОстМ.Номенклатура
|ГДЕ
| ДокМ.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
| ДокМ.Номенклатура";
Запрос.УстановитьПараметр("МоментВремени", МоментВремени());
Запрос.УстановитьПараметр("ОтвСотр", ОтветственныйСотрудник);
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Результат = Запрос.Выполнить();
ВыборкаДЗ = Результат.Выбрать();
Движения.ОстаткиМатериалов.Записывать=Истина;
Движения.Продажи.Записывать=Истина;
Пока ВыборкаДЗ.Следующий() Цикл
Если ВыборкаДЗ.Количество>ВыборкаДЗ.КоличествоОстатков Тогда
Сообщить("Недостаточное количество товара "+ВыборкаДЗ.Номенклатура
+", необходимо "+ВыборкаДЗ.Количество+", в наличии "
+ВыборкаДЗ.КоличествоОстатков);
Отказ=Истина;
Движения.ОстаткиМатериалов.Записывать=Ложь;
Движения.Продажи.Записывать=Ложь;
КонецЕсли;
Если Отказ Тогда
Продолжить;
КонецЕсли;
Движение=Движения.ОстаткиМатериалов.Добавить();
Движение.ВидДвижения=ВидДвиженияНакопления.Расход;
Движение.Период=Дата;
Движение.Номенклатура=ВыборкаДЗ.Номенклатура;
Движение.Количество=ВыборкаДЗ.Количество;
Движение.Сумма=ВыборкаДЗ.Количество*ВыборкаДЗ.СуммаОстатков/ВыборкаДЗ.КоличествоОстатков;
Движение.ОтветственныйСотрудник=ОтветственныйСотрудник;
Движение=Движения.Продажи.Добавить();
Движение.Период=Дата;
Движение.Номенклатура=ВыборкаДЗ.Номенклатура;
Движение.Количество=ВыборкаДЗ.Количество;
Движение.Себестоимость=ВыборкаДЗ.Количество*ВыборкаДЗ.СуммаОстатков/ВыборкаДЗ.КоличествоОстатков;
Движение.Выручка=ВыборкаДЗ.Выручка;
Движение.ОтветственныйСотрудник=ОтветственныйСотрудник;
Движение.Контрагент=Покупатель;
КонецЦикла;
КонецПроцедуры
Так, здесь мы, во-первых, проверим достаточность материалов для списания – ранее заполненная табличная часть, служит лишь подсказкой пользователю, к тому же, он может в процессе работы получать сведения об остатках и себестоимости единицы, а может и не получать, оставляя соответствующие поля табличной части пустыми, поэтому при проведении документа мы получим с помощью запроса нужные данные из базы.
Дальше все идет по уже знакомому вам плану – мы сверяем количество материалов, которое пользователь хочет продать с количеством остатков и принимаем решение либо о продолжении работы, либо – об отмене процедуры проведения документа.
После того, как у нас есть хранилище данных о продажах, мы построим соответствующий отчет. На базе тех данных, которые у нас есть, можно построить различные отчеты – все зависит от того, какие именно данные нас интересуют.