2. Но должна существовать возможность отключения контроля для конкретного пользователя.
Общий модуль – “ГлобальныеПеременные”, сервер, повторное использ. возвр. знач. – На время сеанса;
Функция ПолучитьКонтрольОстатков() Экспорт
ТекущийПользователь = РаботаСПользователями.СинхронизацияПользователя();
Возврат НЕ ТекущийПользователь.ОтключитьКонтроль;
КонецФункции // ПолучитьКонтрольОстатков()
3. В списке реализаций должна существовать кнопка .
В форме списка – Документы – “РеализацияТоваров” – создал кнопку “Провести без контроля”
Результат = Запрос.Выполнить();
Движения.ОстаткиНоменклатуры.Загрузить(Результат.Выгрузить());
Движения.ОстаткиНоменклатуры.Записать();
Если КонтрольОстатков Тогда
Запрос.Текст = "ВЫБРАТЬ
| ОстаткиНоменклатурыОстатки.Номенклатура,
| ОстаткиНоменклатурыОстатки.Качество,
| ОстаткиНоменклатурыОстатки.КоличествоОстаток Количество,
| Товары.НомерСтроки
|ИЗ
| РегистрНакопления.ОстаткиНоменклатуры.Остатки(
| &Момент,
| (Номенклатура, Качество) В
| (ВЫБРАТЬ РАЗЛИЧНЫЕ
| ЕСТЬNULL(СоставНабора.Комплектующая, РеализацияТоваровТовары.Номенклатура) КАК Номенклатура,
| РеализацияТоваровТовары.Качество
| ИЗ
| Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СоставНабора КАК СоставНабора
| ПО
| РеализацияТоваровТовары.Номенклатура = СоставНабора.Набор
| И РеализацияТоваровТовары.Номенклатура.ВидНоменклатуры = &ВидНабор
| ГДЕ
| РеализацияТоваровТовары.Ссылка = &Ссылка
| И РеализацияТоваровТовары.Номенклатура.ВидНоменклатуры <> &ВидУслуга)) КАК ОстаткиНоменклатурыОстатки
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
| ЕСТЬNULL(СоставНабора.Комплектующая, РеализацияТоваровТовары.Номенклатура) КАК Номенклатура,
| РеализацияТоваровТовары.Качество КАК Качество,
| МИНИМУМ(РеализацияТоваровТовары.НомерСтроки) КАК НомерСтроки
| ИЗ
| Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СоставНабора КАК СоставНабора
| ПО (РеализацияТоваровТовары.Номенклатура = СоставНабора.Набор
| И РеализацияТоваровТовары.Номенклатура.ВидНоменклатуры = &Виднабор)
| ГДЕ
| РеализацияТоваровТовары.Ссылка = &Ссылка
| И РеализацияТоваровТовары.Номенклатура.ВидНоменклатуры <> &ВидУслуга
|
| СГРУППИРОВАТЬ ПО
| ЕСТЬNULL(СоставНабора.Комплектующая, РеализацияТоваровТовары.Номенклатура),
| РеализацияТоваровТовары.Качество) КАК Товары
| ПО ОстаткиНоменклатурыОстатки.Номенклатура = Товары.Номенклатура
| И ОстаткиНоменклатурыОстатки.Качество = Товары.Качество
|ГДЕ
| ОстаткиНоменклатурыОстатки.КоличествоОстаток < 0";
Если РежимПроведения = РежимПроведенияДокумента.Оперативный Тогда
Запрос.УстановитьПараметр("Момент", Неопределено);
Иначе
Граница = Новый Граница(МоментВремени(), ВидГраницы.Включая);
Запрос.УстановитьПараметр("Момент", Граница);
КонецЕсли;
Результат = Запрос.Выполнить();
Если НЕ Результат.Пустой() Тогда
Отказ = Истина;
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Номенклатуры "+Выборка.Номенклатура+" качества <"+Выборка.Качество+"> недостаточно в количестве "+(-Выборка.Количество);
Сообщение.Поле = "Товары["+(Выборка.НомерСтроки-1)+"].Количество";
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
4. Создайте регистр для учета продаж и обеспечьте его заполнение при проведении
реализации.
Создал Регистр накопления “Продажи”, вид – оборотный:
– измерения “Контрагент”, тип – СправочникСсылка.Контрагенты;
– измерения “Номенклатура”, тип – СправочникСсылка.Номенклатура;
– измерения “Менеджер”, тип – СправочникСсылка.Пользователи;
– ресурс “Сумма”, тип – Число, 15,2;
– ресурс “Количество”, тип – Число, 15,3;
– регистратор “РеализацияТоваров”.
5. Необходимо обеспечить ведение взаиморасчетов (долгов) с покупателями и поставщиками.
Создал Регистр накопления “Взаиморасчеты”, вид – Остатки:
– измерения “Контрагент”, тип – СправочникСсылка.Контрагенты;
– ресурс “Сумма”, тип – Число, 15,2;
– регистратор “ПоступлениеТоваров”;
– регистратор “РеализацияТоваров”;
– регистратор “Выписка”.
6. Для учета оплат по банку создайте документ .
Создал документ “Выписка”:
– табл. часть “Оплаты”:
– реквизит “Контрагент”, тип – СправочникСсылка.Контрагенты;
– реквизит “Приход”, тип – Число, 15,2;
– реквизит “Расход”, тип – Число, 15,2;
– движение по регистру накопления “Взаиморасчеты”.
– модуль:
Процедура ОбработкаПроведения(Отказ, Режим)
Движения.Взаиморасчеты.Записывать = Истина;
Для Каждого ТекСтрокаОплаты Из Оплаты Цикл
Если ТекСтрокаОплаты.Приход>0 Тогда
Движение = Движения.Взаиморасчеты.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Контрагент = ТекСтрокаОплаты.Контрагент;
Движение.Сумма = ТекСтрокаОплаты.Приход;
КонецЕсли;
Если ТекСтрокаОплаты.Расход>0 Тогда
Движение = Движения.Взаиморасчеты.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.Контрагент = ТекСтрокаОплаты.Контрагент;
Движение.Сумма = ТекСтрокаОплаты.Расход;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
7. Объект, где будут храниться данные набора.
Создал Регистр сведений “СоставНабора”, непереодический:
– измерения “Набор”, тип – СправочникСсылка.Номенклатура;
– измерения “Комплектующая”, тип – СправочникСсылка.Номенклатура;
– ресурс “Количество”, тип – Число, 15,3.
В общем модуле “ДвиженияПоРегистрам”, создаем два запроса, с помощью конструктора запросов, первый для получения данных регистра остатка номенклатуры, а второй для регистра закупки:
Все материалы этого сайта являются составной частью Базового / Продвинутого курсов по программированию - и являются объектами авторского и имущественного права.
Любое их распространение без письменного согласования с авторами запрещено.
1. Обеспечьте проведение документа по регистру учета остатков
номенклатуры.
Справочники – “Пользователи”, новый реквизит – “ОтключитьКонтроль”, тип – булево.
– модуль документа:
ВыполнитьДвиженияОстаткиНоменклатуры(ГлобальныеПеременные.ПолучитьКонтрольОстатков(), РежимПроведения);
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Запрос.Текст = "ВЫБРАТЬ
| РеализацияТоваровТовары.Номенклатура,
| СУММА(РеализацияТоваровТовары.Количество * РеализацияТоваровТовары.ЕдиницаИзмерения.Коэффициент) КАК Количество,
| РеализацияТоваровТовары.Ссылка.Контрагент,
| СУММА(РеализацияТоваровТовары.Сумма) КАК Сумма,
| РеализацияТоваровТовары.Ссылка.Дата КАК Период,
| РеализацияТоваровТовары.Ссылка.Менеджер
|ИЗ
| Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары
|ГДЕ
| РеализацияТоваровТовары.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
| РеализацияТоваровТовары.Ссылка.Контрагент,
| РеализацияТоваровТовары.Номенклатура,
| РеализацияТоваровТовары.Ссылка.Дата,
| РеализацияТоваровТовары.Ссылка.Менеджер";
Движения.Продажи.Загрузить(Запрос.Выполнить().Выгрузить());
Движения.Продажи.Записывать = Истина;
Взаиморасчеты = Движения.Взаиморасчеты;
Взаиморасчеты.Записывать = Истина;
Запись = Взаиморасчеты.Добавить();
Запись.ВидДвижения = ВидДвиженияНакопления.Приход;
Запись.Период = Дата;
Запись.Контрагент = Контрагент;
Запись.Сумма = СуммаДокумента;
КонецПроцедуры
2. Но должна существовать возможность отключения контроля для конкретного пользователя.
Общий модуль – “ГлобальныеПеременные”, сервер, повторное использ. возвр. знач. – На время сеанса;
ТекущийПользователь = РаботаСПользователями.СинхронизацияПользователя();
Возврат НЕ ТекущийПользователь.ОтключитьКонтроль;
КонецФункции // ПолучитьКонтрольОстатков()
3. В списке реализаций должна существовать кнопка .
В форме списка – Документы – “РеализацияТоваров” – создал кнопку “Провести без контроля”
Процедура ПровестиБезКонтроля(Команда)
ПровестиБезКонтроляСервер();
КонецПроцедуры
&НаСервере
Процедура ПровестиБезКонтроляСервер()
Ссылка = Элементы.Список.ТекущаяСтрока;
Если Ссылка = Неопределено Тогда
Возврат;
КонецЕсли;
НачатьТранзакцию();
Объект = Ссылка.ПолучитьОбъект();
Объект.ВыполнитьДвиженияОстаткиНоменклатуры(Ложь, РежимПроведенияДокумента.Неоперативный);
ЗафиксироватьТранзакцию();
КонецПроцедуры // ПровестиБезКонтроляСервер()
Документы – “РеализацияТоваров” – модуль:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЕСТЬNULL(СоставНабора.Комплектующая, РеализацияТоваровТовары.Номенклатура) КАК Номенклатура,
| РеализацияТоваровТовары.Количество * РеализацияТоваровТовары.ЕдиницаИзмерения.Коэффициент * ЕСТЬNULL(СоставНабора.Количество, 1) КАК Количество,
| РеализацияТоваровТовары.Сумма,
| РеализацияТоваровТовары.Качество,
| РеализацияТоваровТовары.Ссылка.Дата КАК Период,
| ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход) КАК ВидДвижения
|ИЗ
| Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СоставНабора КАК СоставНабора
| ПО РеализацияТоваровТовары.Номенклатура = СоставНабора.Набор
| И (РеализацияТоваровТовары.Номенклатура.ВидНоменклатуры = &ВидНабор)
|ГДЕ
| РеализацияТоваровТовары.Ссылка = &Ссылка
| И РеализацияТоваровТовары.Номенклатура.ВидНоменклатуры <> &ВидУслуга";
Запрос.УстановитьПараметр("ВидНабор", Перечисления.ВидыНоменкклатуры.Набор);
Запрос.УстановитьПараметр("ВидУслуга", Перечисления.ВидыНоменкклатуры.Услуга);
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Результат = Запрос.Выполнить();
Движения.ОстаткиНоменклатуры.Загрузить(Результат.Выгрузить());
Движения.ОстаткиНоменклатуры.Записать();
Если КонтрольОстатков Тогда
Запрос.Текст = "ВЫБРАТЬ
| ОстаткиНоменклатурыОстатки.Номенклатура,
| ОстаткиНоменклатурыОстатки.Качество,
| ОстаткиНоменклатурыОстатки.КоличествоОстаток Количество,
| Товары.НомерСтроки
|ИЗ
| РегистрНакопления.ОстаткиНоменклатуры.Остатки(
| &Момент,
| (Номенклатура, Качество) В
| (ВЫБРАТЬ РАЗЛИЧНЫЕ
| ЕСТЬNULL(СоставНабора.Комплектующая, РеализацияТоваровТовары.Номенклатура) КАК Номенклатура,
| РеализацияТоваровТовары.Качество
| ИЗ
| Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СоставНабора КАК СоставНабора
| ПО
| РеализацияТоваровТовары.Номенклатура = СоставНабора.Набор
| И РеализацияТоваровТовары.Номенклатура.ВидНоменклатуры = &ВидНабор
| ГДЕ
| РеализацияТоваровТовары.Ссылка = &Ссылка
| И РеализацияТоваровТовары.Номенклатура.ВидНоменклатуры <> &ВидУслуга)) КАК ОстаткиНоменклатурыОстатки
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
| ЕСТЬNULL(СоставНабора.Комплектующая, РеализацияТоваровТовары.Номенклатура) КАК Номенклатура,
| РеализацияТоваровТовары.Качество КАК Качество,
| МИНИМУМ(РеализацияТоваровТовары.НомерСтроки) КАК НомерСтроки
| ИЗ
| Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СоставНабора КАК СоставНабора
| ПО (РеализацияТоваровТовары.Номенклатура = СоставНабора.Набор
| И РеализацияТоваровТовары.Номенклатура.ВидНоменклатуры = &Виднабор)
| ГДЕ
| РеализацияТоваровТовары.Ссылка = &Ссылка
| И РеализацияТоваровТовары.Номенклатура.ВидНоменклатуры <> &ВидУслуга
|
| СГРУППИРОВАТЬ ПО
| ЕСТЬNULL(СоставНабора.Комплектующая, РеализацияТоваровТовары.Номенклатура),
| РеализацияТоваровТовары.Качество) КАК Товары
| ПО ОстаткиНоменклатурыОстатки.Номенклатура = Товары.Номенклатура
| И ОстаткиНоменклатурыОстатки.Качество = Товары.Качество
|ГДЕ
| ОстаткиНоменклатурыОстатки.КоличествоОстаток < 0";
Если РежимПроведения = РежимПроведенияДокумента.Оперативный Тогда
Запрос.УстановитьПараметр("Момент", Неопределено);
Иначе
Граница = Новый Граница(МоментВремени(), ВидГраницы.Включая);
Запрос.УстановитьПараметр("Момент", Граница);
КонецЕсли;
Результат = Запрос.Выполнить();
Если НЕ Результат.Пустой() Тогда
Отказ = Истина;
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Номенклатуры "+Выборка.Номенклатура+" качества <"+Выборка.Качество+"> недостаточно в количестве "+(-Выборка.Количество);
Сообщение.Поле = "Товары["+(Выборка.НомерСтроки-1)+"].Количество";
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
4. Создайте регистр для учета продаж и обеспечьте его заполнение при проведении
реализации.
Создал Регистр накопления “Продажи”, вид – оборотный:
– измерения “Контрагент”, тип – СправочникСсылка.Контрагенты;
– измерения “Номенклатура”, тип – СправочникСсылка.Номенклатура;
– измерения “Менеджер”, тип – СправочникСсылка.Пользователи;
– ресурс “Сумма”, тип – Число, 15,2;
– ресурс “Количество”, тип – Число, 15,3;
– регистратор “РеализацияТоваров”.
5. Необходимо обеспечить ведение взаиморасчетов (долгов) с покупателями и поставщиками.
Создал Регистр накопления “Взаиморасчеты”, вид – Остатки:
– измерения “Контрагент”, тип – СправочникСсылка.Контрагенты;
– ресурс “Сумма”, тип – Число, 15,2;
– регистратор “ПоступлениеТоваров”;
– регистратор “РеализацияТоваров”;
– регистратор “Выписка”.
Документ “ПоступлениеТоваров” – модуль:
ДвиженияПоРегистрам.ПриходНоменклатуры(Движения, Ссылка);
Взаиморасчеты = Движения.Взаиморасчеты;
Взаиморасчеты.Записывать = Истина;
Запись = Взаиморасчеты.Добавить();
Запись.ВидДвижения = ВидДвиженияНакопления.Расход;
Запись.Период = Дата;
Запись.Контрагент = Контрагент;
Запись.Сумма = СуммаДокумента;
КонецПроцедуры
Аналогично делаем и процедуре “ОбработкаПроведения” докмента “РеализацияТоваров”;
Документ “РеализацияТоваров”:
новый реквизит – “СуммаДокумента”, тип – число, 15,2;
– модуль:
СуммаДокумента = Товары.Итог("Сумма");
КонецПроцедуры
6. Для учета оплат по банку создайте документ .
Создал документ “Выписка”:
– табл. часть “Оплаты”:
– реквизит “Контрагент”, тип – СправочникСсылка.Контрагенты;
– реквизит “Приход”, тип – Число, 15,2;
– реквизит “Расход”, тип – Число, 15,2;
– движение по регистру накопления “Взаиморасчеты”.
– модуль:
Движения.Взаиморасчеты.Записывать = Истина;
Для Каждого ТекСтрокаОплаты Из Оплаты Цикл
Если ТекСтрокаОплаты.Приход>0 Тогда
Движение = Движения.Взаиморасчеты.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Контрагент = ТекСтрокаОплаты.Контрагент;
Движение.Сумма = ТекСтрокаОплаты.Приход;
КонецЕсли;
Если ТекСтрокаОплаты.Расход>0 Тогда
Движение = Движения.Взаиморасчеты.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.Контрагент = ТекСтрокаОплаты.Контрагент;
Движение.Сумма = ТекСтрокаОплаты.Расход;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
7. Объект, где будут храниться данные набора.
Создал Регистр сведений “СоставНабора”, непереодический:
– измерения “Набор”, тип – СправочникСсылка.Номенклатура;
– измерения “Комплектующая”, тип – СправочникСсылка.Номенклатура;
– ресурс “Количество”, тип – Число, 15,3.
В общем модуле “ДвиженияПоРегистрам”, создаем два запроса, с помощью конструктора запросов, первый для получения данных регистра остатка номенклатуры, а второй для регистра закупки:
Движения.ОстаткиНоменклатуры.Записывать = Истина;
Движения.Закупка.Записывать = Истина;
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Запрос.УстановитьПараметр("ВидНабор", Перечисления.ВидыНоменкклатуры.Набор);
Запрос.УстановитьПараметр("ВидУслуга", Перечисления.ВидыНоменкклатуры.Услуга);
Запрос.Текст = "ВЫБРАТЬ
| ЕСТЬNULL(СоставНабора.Комплектующая, ПоступлениеТоваровТовары.Номенклатура) КАК Номенклатура,
| СУММА(ПоступлениеТоваровТовары.Количество * ПоступлениеТоваровТовары.ЕдиницаИзмерения.Коэффициент * ЕСТЬNULL(СоставНабора.Количество, 1)) КАК Количество,
| СУММА(ПоступлениеТоваровТовары.Сумма) КАК Сумма,
| ПоступлениеТоваровТовары.Качество,
| ПоступлениеТоваровТовары.Ссылка.Дата КАК Период
|ИЗ
| Документ.ПоступлениеТоваров.Товары КАК ПоступлениеТоваровТовары
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СоставНабора КАК СоставНабора
| ПО (ПоступлениеТоваровТовары.Номенклатура = СоставНабора.Набор
| И ПоступлениеТоваровТовары.Номенклатура.ВидНоменклатуры = &ВидНабор)
|ГДЕ
| ПоступлениеТоваровТовары.Ссылка = &Ссылка
| И ПоступлениеТоваровТовары.Номенклатура.ВидНоменклатуры <> &ВидУслуга
|
|СГРУППИРОВАТЬ ПО
| ПоступлениеТоваровТовары.Качество,
| ПоступлениеТоваровТовары.Ссылка.Дата,
| ЕСТЬNULL(СоставНабора.Комплектующая, ПоступлениеТоваровТовары.Номенклатура)";
Если ЭтоАвансовыйОтчет Тогда
Запрос.Текст = СтрЗаменить(Запрос.Текст,"ПоступлениеТоваров", "АвансовыйОтчет");
КонецЕсли;
Таблица = Запрос.Выполнить().Выгрузить();
Движения.ОстаткиНоменклатуры.Загрузить(Таблица);
Запрос.Текст = "ВЫБРАТЬ
| ПоступлениеТоваровТовары.Номенклатура,
| СУММА(ПоступлениеТоваровТовары.Количество * ПоступлениеТоваровТовары.ЕдиницаИзмерения.Коэффициент) КАК Количество,
| СУММА(ПоступлениеТоваровТовары.Сумма) КАК Сумма,
| ПоступлениеТоваровТовары.Качество,
| ПоступлениеТоваровТовары.Ссылка.Дата КАК Период,
| ПоступлениеТоваровТовары.Ссылка.Контрагент КАК Контрагент
|ИЗ
| Документ.ПоступлениеТоваров.Товары КАК ПоступлениеТоваровТовары
|ГДЕ
| ПоступлениеТоваровТовары.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
| ПоступлениеТоваровТовары.Номенклатура,
| ПоступлениеТоваровТовары.Качество,
| ПоступлениеТоваровТовары.Ссылка.Дата,
| ПоступлениеТоваровТовары.Ссылка.Контрагент";
Если ЭтоАвансовыйОтчет Тогда
Запрос.Текст = СтрЗаменить(Запрос.Текст,"ПоступлениеТоваров", "АвансовыйОтчет");
Запрос.Текст = СтрЗаменить(Запрос.Текст,"АвансовыйОтчетТовары.Ссылка.Контрагент", "Значение(Справочник.Контрагенты.ПустаяСсылка)");
КонецЕсли;
Таблица = Запрос.Выполнить().Выгрузить();
Движения.Закупка.Загрузить(Таблица);
КонецПроцедуры
8. Созданы отчеты “ДолгиМенеджерам”, “Прогнозируемый финансовый результат”, “Рейтинг менеджеров”.