Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
06 июл 2022, 04:44

Периоды обновления

Автор Дмитрий357, 06 ноя 2021, 07:13

0 Пользователей и 1 гость просматривают эту тему.

Дмитрий357

Добрый день! Помогите решить такую задачу, где нужно прописать код и какой или какими-либо другими методами. Есть справочник "Виды цен", который хранит в себе пользовательские виды цен. Документ "Установка цен номенклатуры" задаются виды цен и цена для номенклатурной позиции и записываются в регистр сведений с периодичностью день. В качестве регистратора регистра выступает этот документ. Задача заключается в том, чтобы цены могли обновляться не чаще чем раз в день и начинают действовать с начала дня. Виды цен содержится в шапке документов поступление и реализация товаров.
И вторая задача с такой же сутью, только здесь выступают методы списания себестоимости по данным оперативного учета. Они могут меняться не чаще 1 раза в год и начинают действовать с начала года. Методы списания хранятся в Перечислении и записываются в регистр сведений Учетная политика с периодичностью в пределах года, тип независимый. 
Код первой задачи, содержащийся в модуле формах документов поступления и реализация товаров:
Функция ПодставитьЦеныНоменклатуры(Номенклатура, ВидЦены, Дата)
  //{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЦеныНоменклатурыСрезПоследних.Цена КАК ЦенаПолучаемая
|ИЗ
| РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
| &Дата,
| ВидЦены = &ВидЦены
| И Номенклатура = &Номенклатура) КАК ЦеныНоменклатурыСрезПоследних";

Запрос.УстановитьПараметр("ВидЦены", Объект.ВидЦены);
Запрос.УстановитьПараметр("Дата", Объект.Дата);
Запрос.УстановитьПараметр("Номенклатура", Номенклатура);

РезультатЗапроса = Запрос.Выполнить();
Если РезультатЗапроса.Пустой() Тогда
Цена=0;
Сообщить ("Цена "+ВидЦены+" для "+Номенклатура+" не установлена!");
Иначе
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Цена=ВыборкаДетальныеЗаписи.ЦенаПолучаемая;
КонецЦикла;
КонецЕсли;
//}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
Возврат Цена/ЗначениеКурсаВалютКлиентСервер.РассчитатьПоКурсу(Объект.Валюта, Объект.Дата);
КонецФункции


&НаКлиенте
Процедура ТоварыНоменклатураКоличествоВалютаВидЦеныПриИзменении(Элемент)
Рассчитывать=ПолучитьЗначенияКонстанты ();
СтрокаТЧ=Элементы.Товары.ТекущиеДанные;
Для Каждого СтрокаТЧ ИЗ Объект.Товары Цикл
СтрокаТЧ.Цена=ПодставитьЦеныНоменклатуры(СтрокаТЧ.Номенклатура, Объект.ВидЦены, Объект.Дата);
Если Рассчитывать=Истина Тогда
РасчетСтоимостиКлиентСервер.РассчитатьСтоимость(СтрокаТЧ);
КонецЕсли;
КонецЦикла;
КонецПроцедуры

Код второй задачи, содержащийся в модуле объекта документа реализация товаров:
//{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
//{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| УчетнаяПолитикаСрезПоследних.МетодСписания КАК МетодСписания
|ИЗ
| РегистрСведений.УчетнаяПолитика.СрезПоследних(&Дата, ) КАК УчетнаяПолитикаСрезПоследних";

Запрос.УстановитьПараметр("Дата", Дата);

РезультатЗапроса = Запрос.Выполнить();

ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

Если ВыборкаДетальныеЗаписи.Следующий() Тогда
МетодСписания=ВыборкаДетальныеЗаписи.МетодСписания;
Иначе
Отказ=Истина;
Сообщить("Не установлена учетная политика");
Возврат;
КонецЕсли;

Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить ("РегистрНакопления.ТоварыНаСкладах");
ЭлементБлокировки.ИсточникДанных = Товары;
ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура","Номенклатура");
Блокировка.Заблокировать();

//}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА

Движения.ТоварыНаСкладах.Записывать = Истина;
Движения.ТоварыНаСкладах.Записать();
Движения.Хозрасчетный.Записывать = Истина;
Движения.Хозрасчетный.Записать ();
//{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РеализацияТоваровУслугТовары.Номенклатура КАК Номенклатура,
| СУММА(РеализацияТоваровУслугТовары.Количество) КАК Количество,
| СУММА(РеализацияТоваровУслугТовары.Стоимость) КАК Стоимость
|ПОМЕСТИТЬ ВТ_ДокТЧ
|ИЗ
| Документ.РеализацияТоваров.Товары КАК РеализацияТоваровУслугТовары
|ГДЕ
| РеализацияТоваровУслугТовары.Ссылка = &Ссылка
| И РеализацияТоваровУслугТовары.Ссылка.Валюта = &Валюта
|
|СГРУППИРОВАТЬ ПО
| РеализацияТоваровУслугТовары.Номенклатура
|
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТ_ДокТЧ.Номенклатура КАК Номенклатура,
| ВТ_ДокТЧ.Номенклатура.Представление КАК НоменклатураПредставление,
| ВТ_ДокТЧ.Количество КАК Количество,
| ВТ_ДокТЧ.Стоимость КАК Стоимость,
| ЕСТЬNULL(ТоварыНаСкладахОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток,
| ЕСТЬNULL(ТоварыНаСкладахОстатки.СуммаОстаток, 0) КАК СуммаОстаток,
| ТоварыНаСкладахОстатки.Партия КАК Партия,
| ТоварыНаСкладахОстатки.Партия.Представление КАК ПартияПредставление
|ИЗ
| ВТ_ДокТЧ КАК ВТ_ДокТЧ
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(
| &МоментВремени,
| Номенклатура В
| (ВЫБРАТЬ РАЗЛИЧНЫЕ
| ВТ_ДокТЧ.Номенклатура КАК Номенклатура
| ИЗ
| ВТ_ДокТЧ КАК ВТ_ДокТЧ)
| И Склад = &Склад) КАК ТоварыНаСкладахОстатки
| ПО ВТ_ДокТЧ.Номенклатура = ТоварыНаСкладахОстатки.Номенклатура
|
|УПОРЯДОЧИТЬ ПО
| ТоварыНаСкладахОстатки.Партия.МоментВремени УБЫВ
|ИТОГИ
| МАКСИМУМ(Количество),
| МАКСИМУМ(Стоимость),
| СУММА(КоличествоОстаток),
| СУММА(СуммаОстаток)
|ПО
| Номенклатура";

Если МетодСписания = Перечисления.МетодыСписания.FIFO Тогда
Запрос.Текст = СтрЗаменить (Запрос.Текст, "УБЫВ", "ВОЗР");
КонецЕсли;
Запрос.УстановитьПараметр("МоментВремени", Новый Граница (МоментВремени (), ВидГраницы.Исключая));
Запрос.УстановитьПараметр("Склад", Склад);
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Запрос.УстановитьПараметр("Валюта", Валюта);

РезультатЗапроса = Запрос.Выполнить();
                                                                 
ВыборкаНоменклатура = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

Пока ВыборкаНоменклатура.Следующий() Цикл
Если ВыборкаНоменклатура.Количество > ВыборкаНоменклатура.КоличествоОстаток Тогда
Сообщить ("Недостаточно товара " + ВыборкаНоменклатура.НоменклатураПредставление + ". Недостаточно "+(ВыборкаНоменклатура.Количество-ВыборкаНоменклатура.КоличествоОстаток)+" шт.");
Отказ = Истина;
КонецЕсли;
Если Не Отказ Тогда
Если МетодСписания=Перечисления.МетодыСписания.ПоСредней Тогда
Движение = Движения.ТоварыНаСкладах.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Номенклатура = ВыборкаНоменклатура.Номенклатура;
Движение.Склад=Склад;
    Движение.Количество =ВыборкаНоменклатура.Количество;
    Движение.Сумма =ВыборкаНоменклатура.СуммаОстаток/ВыборкаНоменклатура.КоличествоОстаток*ВыборкаНоменклатура.Количество*ЗначениеКурсаВалютКлиентСервер.РассчитатьПоКурсу(Валюта, Дата);
    Иначе
ВыборкаДетальныеЗаписи = ВыборкаНоменклатура.Выбрать();
ОсталосьСписать = ВыборкаНоменклатура.Количество;
    Пока ВыборкаДетальныеЗаписи.Следующий() И ОсталосьСписать>0 Цикл
Движение = Движения.ТоварыНаСкладах.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура;
Движение.Склад=Склад;   
Движение.Количество = мин(ОсталосьСписать, ВыборкаДетальныеЗаписи.КоличествоОстаток);
Если Движение.Количество = ВыборкаДетальныеЗаписи.КоличествоОстаток Тогда
Движение.Сумма = ВыборкаДетальныеЗаписи.СуммаОстаток*ЗначениеКурсаВалютКлиентСервер.РассчитатьПоКурсу(Валюта, Дата);
Иначе
Движение.Сумма = ВыборкаДетальныеЗаписи.СуммаОстаток/ВыборкаДетальныеЗаписи.КоличествоОстаток*Движение.Количество*ЗначениеКурсаВалютКлиентСервер.РассчитатьПоКурсу(Валюта, Дата);
КонецЕсли;
Движение.Партия=ВыборкаДетальныеЗаписи.Партия;
ОсталосьСписать=ОсталосьСписать-Движение.Количество;
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецЦикла;

Дмитрий357

кто знает?! Помогите пжл)

Optiman

Цитата: Дмитрий357 от 06 ноя 2021, 07:13записываются в регистр сведений с периодичностью день... Задача заключается в том, чтобы цены могли обновляться не чаще чем раз в день и начинают действовать с начала дня.
Если действительно в регистре сведений указана периодичность "День", то при записи реквизит "Период" будет автоматически регистрироваться на начало дня. Если Вы будете записывать в регистр такую же номенклатуру с таким же типом цен в этот же день, то программа должна выдавать ошибку записи в регистр: "Запись с такими данными уже существует".

Аналогично и для периодичности "Год".

Дмитрий357

Optiman, Хорошо, это понятно. А как быть с уже ранее записанной номенклатурой? Т.е. я задал допустим вид цены - закупочная, номенклатура - мука, цена - 500 руб. Я ее могу тут же поменять и ошибка не выдастся. Мне кажется, это является условием задачи, чтобы в течение дня пользователь уже ранее заданную цену мог обновить всего раз. Разве не так? Как это можно решить? Аналогично,. для года

Optiman

Цитата: Дмитрий357 от 08 ноя 2021, 19:56А как быть с уже ранее записанной номенклатурой? Т.е. я задал допустим вид цены - закупочная, номенклатура - мука, цена - 500 руб. Я ее могу тут же поменять и ошибка не выдастся.
Можете менять сколько угодно раз, т.к. при проведении документа предыдущие записи в регистре удаляются. Следовательно, в этом периоде записей в регистре не будет. Другим документом не сможете сделать запись на такую же номенклатуру и тип цен.

Цитата: Дмитрий357 от 08 ноя 2021, 19:56Мне кажется, это является условием задачи, чтобы в течение дня пользователь уже ранее заданную цену мог обновить всего раз. Разве не так?
Всего раз не получится. Если есть возможность перепроводить документ, то это можно будет сделать сколько угодно раз.
Тут уже только 2 варианта:
1) провести 1 раз и жестко заблокировать всякое изменение.
2) разрешить перепроведение документа, тогда можно будет это делать сколько угодно раз.

Теги:

Похожие темы (5)

Рейтинг@Mail.ru Rambler's Top100

Поиск