Добрий день!
Підкажіть будь ласка, чому не формуються рухи по регістру?
Движения.Продажи.Записывать = Истина; // встановлюємо значення цього регістра в значення Истина
Для Каждого Движение Из Движения.ОстаткиТоваров Цикл
Если Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура Тогда
Движение.Сумма = Движение.Количество * ВыборкаДетальныеЗаписи.Сума / ВыборкаДетальныеЗаписи.Количество;
ДвижениеПродажи = Движение.Продажи.Добавить ();
ДвижениеПродажи.Период = Дата;
ДвижениеПродажи.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура;
ДвижениеПродажи.Контрагент = Контрагент;
ДвижениеПродажи.Сумма = Движение.Выручка;
ДвижениеПродажи.Себестоимость = Движение.Сумма;
ДвижениеПродажи.Количество = Движение.Количество;
Установить отбор по документу
прочитать
изменить
записать
// ...
Движения.Записать();
// Контроль Залишків....
Движения.Записать();
Если Режим = РежимПроведенияДокумента.Оперативный Тогда
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ОстаткиТоваровОстатки.Номенклатура КАК Номенклатура,
| ОстаткиТоваровОстатки.КоличествоОстаток КАК Количество
|ИЗ
| РегистрНакопления.ОстаткиТоваров.Остатки(
| ,
| Номенклатура В
| (ВЫБРАТЬ
| РеализацияТоваровТовары.Номенклатура КАК Номенклатура
| ИЗ
| Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары
| ГДЕ
| РеализацияТоваровТовары.Ссылка = &Ссылка)) КАК ОстаткиТоваровОстатки
|ГДЕ
| ОстаткиТоваровОстатки.КоличествоОстаток < 0";
Запрос.УстановитьПараметр("Ссылка", Ссылка);
РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой () Тогда
// тоді потрібно повідомляти про помилкі і відмовитися від проедення док-та.. для цього використовується параметр Отказ..
Отказ = Истина;
КонецЕсли;
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Сообщить("В документе "+ Ссылка+" образовались отрицательные остатки");
Сообщить("По номенклатуре "+ВыборкаДетальныеЗаписи.Номенклатура+" остаток "+ВыборкаДетальныеЗаписи.Количество);
КонецЦикла;
КонецЕсли;
Если НЕ Отказ Тогда
Возврат;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ОстаткиТоваровОстатки.Номенклатура КАК Номенклатура,
| ОстаткиТоваровОстатки.КоличествоОстаток КАК КоличествоОстаток,
| ОстаткиТоваровОстатки.СумаОстаток КАК СумаОстаток
|ИЗ
| РегистрНакопления.ОстаткиТоваров.Остатки(
| &МоментВремени,
| Номенклатура В
| (ВЫБРАТЬ
| ОстаткиТоваровОстатки.Номенклатура КАК Номенклатура
| ИЗ
| РегистрНакопления.ОстаткиТоваров.Остатки КАК ОстаткиТоваровОстатки
| ГДЕ
| ОстаткиТоваровОстатки.Номенклатура.Ссылка = &Ссылка)) КАК ОстаткиТоваровОстатки";
Запрос.УстановитьПараметр("МоментВремени", МоментВремени() );
Запрос.УстановитьПараметр("Ссылка", Ссылка);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Движения.ОстаткиТоваров.Записывать = Истина;
Движения.Продажи.Записывать = Истина; // встановлюємо значення цього регістра в значення Истина
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
// Зіставляємо строки вібірки, зі строками табличної частини нашого док-та..
// це необхідно для того щоб з'ясувати яка кількість товара, буде списуватися..
Для Каждого Движение Из Движения.ОстаткиТоваров Цикл
Если Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура Тогда
// Розрахунок Собывартості..
Движение.Сумма = Движение.Количество * ВыборкаДетальныеЗаписи.Сума / ВыборкаДетальныеЗаписи.Количество;
// Рух по регістру Продажі. Заповнюємо Рухи по регістру Продажі..
ДвижениеПродажи = Движение.Продажи.Добавить ();
ДвижениеПродажи.Период = Дата;
ДвижениеПродажи.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура;
ДвижениеПродажи.Контрагент = Контрагент;
ДвижениеПродажи.Сумма = Движение.Выручка;
ДвижениеПродажи.Себестоимость = Движение.Сумма;
ДвижениеПродажи.Количество = Движение.Количество;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Записувати потрібно після того, як додаєте.
ДвижениеПродажи = Движение.Продажи.Добавить ();
// ...
Движение.Записать();
Vofka @ 23.06.22, 8:32
,
Не знайшов де і в чому саме помилка. Підкажіть будь ласка..
// Контроль Залишків....
//1) спочатку товар списується, створюються Рухи у регістрі Залишкі.. Вида - Видаток..
// Після цього, примусово записуємо Рухи в БД.. для цього ми використовуємо метод Записать(); - Движения.Записать();
//У цьому випадку записуються всі ті набори записів
// в яких прапорець взведен у Истина..
Движения.Записать();
//2) Після цього потрібно виконати Контроль Залишків, і для цього потрібно виконати Запит..
// Звертаємось до ВТ Залишкі.. Прописуємо Умову - ОстаткиТоваровОстатки.КоличествоОстаток < 0
// (ця умова з & не буде корректною, так як, система буде розпізнавати 0 як параметр..
//тому потрібно через довілну умову прибрати прапорець, і видалити &)
//3) редагуємо Псевдними...
//4) Даний Запит буде повертати Залишкі по всім товарам з БД... А нам потрібні Залишкі які є в нашому проводимому док-ті..
// Тому потрібно задати параметри ВТ.. і пригадуємо що потрібно отфільтровати входження Номенклатури в Список.. /
// У запиті ми звертаємось до ТЧ - РеализациЯТоваровТовары.. - вибираємо Номенклатуру..
// і вказуємо Умову.. Тільки Товари з нашого док-та.., фільтр по полю - Ссылка..
// OK.. Запит готовий..
// Записувати потрібно після того, як додаєте.
//5) Контроль залишків виконується для Опертивного проведення док-тів..
// Накладуємо Умову на параметр обробки проведення Режим..
Если Режим = РежимПроведенияДокумента.Оперативный Тогда
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ОстаткиТоваровОстатки.Номенклатура КАК Номенклатура,
| ОстаткиТоваровОстатки.КоличествоОстаток КАК Количество
|ИЗ
| РегистрНакопления.ОстаткиТоваров.Остатки(
| ,
| Номенклатура В
| (ВЫБРАТЬ
| РеализацияТоваровТовары.Номенклатура КАК Номенклатура
| ИЗ
| Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары
| ГДЕ
| РеализацияТоваровТовары.Ссылка = &Ссылка)) КАК ОстаткиТоваровОстатки
|ГДЕ
| ОстаткиТоваровОстатки.КоличествоОстаток < 0";
Запрос.УстановитьПараметр("Ссылка", Ссылка);
РезультатЗапроса = Запрос.Выполнить();
// перевірка пустий запит чи ні..
Если Не РезультатЗапроса.Пустой () Тогда
// тоді потрібно повідомляти про помилкі і відмовитися від проедення док-та.. для цього використовується параметр Отказ..
Отказ = Истина;
// Відмова = Істина; - це не скасування проведення, а відмова від проведення зараз
//це просто відступ для уточнення.відмова від проведення - документ залишається у тому стані, в якому був,
// а скасування проведення - це жорстко - було проведено, став непроведений.
КонецЕсли;
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Сообщить("В документе "+ Ссылка+" образовались отрицательные остатки");
// в рамках цикла по вибірки вставимо діагностичне повідомлення..
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
// Вставляємо повідомлення про Залишок поНоменклатурі..
Сообщить("По номенклатуре "+ВыборкаДетальныеЗаписи.Номенклатура+" остаток "+ВыборкаДетальныеЗаписи.Количество);
// Після цього запускаємо платформу і виконуємо перевірку.. Перевірка працює тільки для Оперативно проведених док-тів.. Тому якщо будуть проводитися
// док-ти учорашнім числом, то ніяких Помилок не буде...
КонецЦикла;
КонецЕсли;
// Розрахунок Собывартості..
//1) В задачі не йде мова про стоврення окремого регістра для вирішення питання.. Не сказано нічого ніяких вимог для розрахунку Собівартості..
// В нас один Склад одна Органызація - тому Собівартість буде зберігатися в розрізі Номенклатури..
// дані про Собівартість будемо зберігати в окремому Регістрі - ОстаткиТоваров..
//2) Створюємо окремий ресурс - Сума... Далі потрібно забеспечити формування прибуткових записів по Собівартості..
// тобто при проведенні Надходження товарів потрібно - заповнювати інформацію про Сумі..
// Движение.Сумма = ТекСтрокаТовары.Сумма - прибуткові рухи за Собівартістю заповнені..
// для того щоб вони створилися у БД - потрібно провести док-т.. (документ поступление товаров)
// 3) забеспечуєм проведення док-тів Реалізація Товарів.. Якщо Контроль Негативних Залишків не пройшов, то Собівартості проводити нічого не потрібно.. /
// У противному випадку, якщо док-т коректно проводиться, то потрыбно розрахувати Собывартысть, яку ми будемо списувати з регістра..
// для цього потрібно до Залишків вибираємо Кількість і Сумму..
// Створюємо Умову, що нас цікавить інформація тільки по той Номенклатурі яка є в докуенті Реалізація Товарів..
Если НЕ Отказ Тогда
// 4) Якщо Контроль Негативних Залишків не пройшов, то по Собівартості..
Возврат;
//5) Якщо відмова то поветаємось з Процедури.. У противному випадку - мені потрібно буде отримати дані з Собівартості...
// 6) Якщо документ коректно проводиться - то потрібно вичисляти Собівартість яку потрібно Списувати з регістра..
// 7)Для цього звертаємось до Залишків.. Вибираємо дані (усі три поля).. Звертаємось до Вт...
// Створюємо Умову, що нас цікавить інформація по тій Номенклатурі, яка є в документі Реалізація Товарів..
// прописуэмо Умову по ссилці у цьому вкладеному запиті..
// 8) Визначили умову для параметрів ВТ.. та також вкажемо - Період.. - &МоментВремени..
// Змінюємо Псевдоніми..
//КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ОстаткиТоваровОстатки.Номенклатура КАК Номенклатура,
| ОстаткиТоваровОстатки.КоличествоОстаток КАК Количество,
| ОстаткиТоваровОстатки.СумаОстаток КАК Сума
|ИЗ
| РегистрНакопления.ОстаткиТоваров.Остатки(
| &МоментВремени,
| Номенклатура В
| (ВЫБРАТЬ
| ОстаткиТоваровОстатки.Номенклатура КАК Номенклатура
| ИЗ
| РегистрНакопления.ОстаткиТоваров.Остатки КАК ОстаткиТоваровОстатки
| ГДЕ
| ОстаткиТоваровОстатки.Номенклатура.Ссылка = &Ссылка)) КАК ОстаткиТоваровОстатки";
//9) Щоб корректно отримати даны про Собівартість, нам необхідно перед проведенням поточного док-та, очисти його Рухи..
// які йомовірно були записані в БД..
// Тому у властивостях док-та, вказуємо видалення рухів автоматично..
Запрос.УстановитьПараметр("МоментВремени", МоментВремени() );
Запрос.УстановитьПараметр("Ссылка", Ссылка);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Движения.ОстаткиТоваров.Записывать = Истина; // встановлюємо значення цього регістра в значення Истина
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
// На кожній ітераціїї цикла, цикл обробляє певну номенклатуру,
Для Каждого Движение Из Движения.ОстаткиТоваров Цикл
// І серед списка рухів, потрібно знайти Рухи по відповідній номенклатурі..
Если Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура Тогда
// Якщо Рухи Номенклатура збігається з тим що в нас є в вибірці то тоді потрібно дозаповнити суму..
// Розрахунок Собывартості..
Движение.Сумма = Движение.Количество * ВыборкаДетальныеЗаписи.Сума / ВыборкаДетальныеЗаписи.Количество;
// Рух по регістру Продажі. Заповнюємо Рухи по регістру Продажі..
// Валовий прибуток..
// Валовий прибуток - це різниця між виручккой та собівартістю.. Це прибуток без врахування загальногосподпарських затрат..
// Рентабільсть - це відношення Прибутку до Виручки
// Рентабільність = Це відношення Валового прибутку к Виручці.. * 100% (але % відсоткі ми не пишемо)...
ДвижениеПродажи = Движение.Продажи.Добавить ();
ДвижениеПродажи.Период = Дата;
ДвижениеПродажи.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура;
ДвижениеПродажи.Контрагент = Контрагент;
ДвижениеПродажи.Сумма = Движение.Выручка;
ДвижениеПродажи.Себестоимость = Движение.Сумма;
ДвижениеПродажи.Количество = Движение.Количество;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Тут халепа:
Если НЕ Отказ Тогда
// 4) Якщо Контроль Негативних Залишків не пройшов, то по Собівартості..
Возврат;
ДвижениеПродажи = Движение.Продажи.Добавить ();
ДвижениеПродажи.Период = Дата;
ДвижениеПродажи.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура;
ДвижениеПродажи.Контрагент = Контрагент;
ДвижениеПродажи.Сумма = Движение.Выручка;
ДвижениеПродажи.Себестоимость = Движение.Сумма;
ДвижениеПродажи.Количество = Движение.Количество;
КонецЕсли;
Движения.Записать();
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua