Формирование Приходного складского ордера на основании Поступления товара

Внимание! Данный форум является модерируемым.
Для получения к нему доступа необходимо зарегистрироваться или авторизоваться на сайте.

Страницы: 1
RSS
Формирование Приходного складского ордера на основании Поступления товара
 
При формированиии Приходного складского ордера на основании Поступления товара, если есть 2 позиции товара, отличающиеся по ГТД (код и наименование одинаковые), то в Приходном складском ордере они объединяются в одну позицию, а количество складывается и задваевается.

Пример:
Проступление товара                      ->                    Приходный складской ордер
1. Код 123;   Товар1; 3 шт
2. Код 123;   Товар1; 1 шт               ->                    1. Код 123;   Товар1; 8 шт

Как исправить???
 
Назовите имя продукта, номер релиза и версию компоненты,
На 10, 15 и 18 релизе ошибка задвоения не воспроизводится.

Пришлите скриншот документа Поступление товаров.
Какой у склада вид?
 
Альфа-Авто: Автосалон+Автосервис+Автозапчасти. Редакция 4.1 (4.1.01.11)

Вид склада "Ордерый и Ячеистый"
 
Мне поможет кто-нибудь?
 
В 11 релизе ошибку воспроизвели вот как:
1. Вводим поступление товара
- Код 123; Товар1; 3 шт
- Код 123; Товар1; 1 шт
2. На основании поступления вводим приходный складской ордер
- Код 123; Товар1; 4 шт
3. Проводим складской ордер
4. Еще раз на основании этого поступления вводим приходный складской ордер
- Код 123; Товар1; 8 шт

Посмотрите скорей всего у Вас уже есть складской ордер введенный на основании Поступления

Ошибка исправлена в 17 релизе, но лучше обновится сразу до 18-го.

Для сверки складского и ордерного учета рекомендую пользоваться отчетом "Сверка товарного и ордерного учета".
 
Складского ордера больше нет, только 1 создается.
 
Значит, есть еще другие способы получения этой ошибки, думаю не надо их все перебирать, а попробовать исправить. Рекомендую обновиться до 18 релиза.

В общем модуле дкДокументы нужно заменить функцию дкВычитаниеТаблиц()

Функция дкВычитаниеТаблиц(Знач ОсновнаяТаблица, МассивВычитаемыхТаблиц, СтруктураОсновнойТаблицы = Неопределено, МассивСтруктурВычитаемыхТаблиц = Неопределено) Экспорт

Если НЕ дкВычитаниеТаблицПроверкаЗаполнения(ОсновнаяТаблица, МассивВычитаемыхТаблиц, СтруктураОсновнойТаблицы, МассивСтруктурВычитаемыхТаблиц) Тогда
#Если Клиент Тогда
Сообщить("Вычитание таблиц не было выполнено, т.к. были обнаружены ошибки в параметрах");
#КонецЕсли
Возврат ОсновнаяТаблица;
КонецЕсли;

Если МассивВычитаемыхТаблиц.Количество() = 0 Тогда
Возврат ОсновнаяТаблица;
КонецЕсли;

Измерения        = СтруктураОсновнойТаблицы.Измерения;
ЕдиницаИзмерения = СтруктураОсновнойТаблицы.ЕдиницаИзмерения;
Количество       = СтруктураОсновнойТаблицы.Количество;

ТекстИзмерений = "";
ТекстСгруппировать = "";
Для Каждого ТекИзмерение Из Измерения Цикл
ТекстИзмерений = ТекстИзмерений + "ВнешнийИсточник." + ТекИзмерение + " КАК " + ТекИзмерение + ",
| ";
ТекстСгруппировать = ТекстСгруппировать + "ВнешнийИсточник." + ТекИзмерение + ",
| ";
КонецЦикла;

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

//Перебираем массив вычитаемых таблиц и выгружаем их в менеджер таблиц
Индекс = 0;
Для Каждого ТекВычитаемаяТаблица Из МассивВычитаемыхТаблиц Цикл
ТекСтруктура = МассивСтруктурВычитаемыхТаблиц[Индекс];

ТекстИзмерений = "";
Для Индекс1 = 0 По Измерения.ВГраница() Цикл
ТекстИзмерений = ТекстИзмерений + "
| ВнешнийИсточник." + ТекСтруктура.Измерения[Индекс1] + " КАК " + Измерения[Индекс1] + ","
КонецЦикла;

ИндексСтрока = Формат(Индекс + 1,"ЧН = 0; ЧГ = ");

ТекстЗапроса = ТекстЗапроса + ?(Индекс = 0 ,"","
|
|ОБЪЕДИНИТЬ ВСЕ
|") + "
|ВЫБРАТЬ
| " + ТекстИзмерений + "
| ВнешнийИсточник." + ТекСтруктура.ЕдиницаИзмерения + " КАК ЕдиницаИзмерения,
| ВнешнийИсточник." + ТекСтруктура.Количество       + " КАК Количество" + ?(Индекс = 0, "
|ПОМЕСТИТЬ
| ВнешнийИсточник", "") + "
|ИЗ
| &ВнешнийИсточник" + ИндексСтрока + " КАК ВнешнийИсточник";

Запрос.УстановитьПараметр("ВнешнийИсточник" + ИндексСтрока, ТекВычитаемаяТаблица);
Индекс = Индекс + 1;
КонецЦикла;

//Объединяем все помещенные таблицы и группируем по Измерениям и ЕдиницеИзмерения
//Результат помещаем в менеджер
ТекстИзмерений = "";
ТекстСоединения = "";
Для Каждого ТекИзмерение Из Измерения Цикл

ТекстИзмерений = ТекстИзмерений + "ВнешнийИсточник." + ТекИзмерение + ",
| ";

ТекстСоединения = ТекстСоединения + "ВнешнийИсточник." + ТекИзмерение + " = ОсновнаяТаблица." + ТекИзмерение + " И
| ";

КонецЦикла;

ТекстЗапроса = ТекстЗапроса + "
|;
|
|ВЫБРАТЬ
| " + ТекстИзмерений   + "
| ВнешнийИсточник.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
| МАКСИМУМ(ЕСТЬNULL(ЕИ.Коэффициент, 1)) КАК Коэффициент,
| СУММА(ВнешнийИсточник.Количество) КАК Количество,
| СУММА(ВЫБОР
| КОГДА ЕИ.Коэффициент ЕСТЬ NULL ТОГДА
| ВнешнийИсточник.Количество
| ИНАЧЕ
| ВнешнийИсточник.Количество*ЕИ.Коэффициент
| КОНЕЦ) КАК КоличествоБаза
|ПОМЕСТИТЬ
| ТаблицаСВычетами
|ИЗ
| ВнешнийИсточник КАК ВнешнийИсточник
|ЛЕВОЕ СОЕДИНЕНИЕ
| Справочник.ЕдиницыИзмерения КАК ЕИ
|ПО
| ВнешнийИсточник.ЕдиницаИзмерения = ЕИ.Ссылка
|
|СГРУППИРОВАТЬ ПО
| " + ТекстИзмерений + "
| ВнешнийИсточник.ЕдиницаИзмерения
|;
|
|ВЫБРАТЬ
| " + ТекстИзмерений   + "
| ВнешнийИсточник.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
| ВнешнийИсточник.Коэффициент КАК Коэффициент,
| ВнешнийИсточник.Количество КАК Количество,
| ВнешнийИсточник.КоличествоБаза КАК КоличествоБаза,
| ВЫБОР
| КОГДА ОсновнаяТаблица.Количество ЕСТЬ NULL ТОГДА
| ВнешнийИсточник.Количество*ВнешнийИсточник.Коэффициент
| КОГДА ВнешнийИсточник.Количество > ОсновнаяТаблица.Количество ТОГДА
| (ВнешнийИсточник.Количество - ОсновнаяТаблица.Количество)*ВнешнийИсточник.Коэффициент
| ИНАЧЕ
| 0
| КОНЕЦ СвободноеКоличество
|ИЗ
| ТаблицаСВычетами КАК ВнешнийИсточник
|ЛЕВОЕ СОЕДИНЕНИЕ
| ОсновнаяТаблица КАК ОсновнаяТаблица
|ПО
| " + ТекстСоединения + "
| ВнешнийИсточник.ЕдиницаИзмерения = ОсновнаяТаблица.ЕдиницаИзмерения
|";

Запрос.Текст = ТекстЗапроса;

ТаблицаСВычетами = Запрос.Выполнить().Выгрузить();

ЕстьКоличествоБазовое  = (НЕ ОсновнаяТаблица.Колонки.Найти("КоличествоБазовое")  = Неопределено);
ЕстьКоэффициент        = (НЕ ОсновнаяТаблица.Колонки.Найти("Коэффициент")        = Неопределено);
ЕстьСумма              = (НЕ ОсновнаяТаблица.Колонки.Найти("Сумма")              = Неопределено);
ЕстьСуммаСкидки        = (НЕ ОсновнаяТаблица.Колонки.Найти("СуммаСкидки")        = Неопределено);
ЕстьСуммаСкидкиСтроки  = (НЕ ОсновнаяТаблица.Колонки.Найти("СуммаСкидкиСтроки")  = Неопределено);
ЕстьСуммаНДС           = (НЕ ОсновнаяТаблица.Колонки.Найти("СуммаНДС")           = Неопределено);
ЕстьСуммаВсего         = (НЕ ОсновнаяТаблица.Колонки.Найти("СуммаВсего")         = Неопределено);

Результат = ОсновнаяТаблица.СкопироватьКолонки();
СтруктураПоиска = Новый Структура();
СтруктураПоискаПоЕдинице = Новый Структура();
Для Каждого ТекИзмерение Из Измерения Цикл
СтруктураПоиска.Вставить(ТекИзмерение);
СтруктураПоискаПоЕдинице.Вставить(ТекИзмерение);
КонецЦикла;
СтруктураПоискаПоЕдинице.Вставить("ЕдиницаИзмерения");
// Вычитание с поиском по единице
Для Каждого ТекСтрока Из ОсновнаяТаблица Цикл

ЗаполнитьЗначенияСвойств(СтруктураПоискаПоЕдинице,    ТекСтрока);
СтруктураПоискаПоЕдинице.Вставить("ЕдиницаИзмерения", СтруктураПоискаПоЕдинице[ЕдиницаИзмерения]);

КоличествоВТаблице = ТекСтрока[Количество];
НайденныеСтроки = ТаблицаСВычетами.НайтиСтроки(СтруктураПоискаПоЕдинице);
Для Каждого НайденнаяСтрока Из НайденныеСтроки Цикл

Если КоличествоВТаблице = 0 Тогда
Прервать;
КонецЕсли;

Если КоличествоВТаблице < НайденнаяСтрока.Количество Тогда
НайденнаяСтрока.Количество = НайденнаяСтрока.Количество - КоличествоВТаблице;
КоличествоВТаблице         = 0;
Иначе
КоличествоВТаблице = КоличествоВТаблице - НайденнаяСтрока.Количество;
ТаблицаСВычетами.Удалить(НайденнаяСтрока);
КонецЕсли;

КонецЦикла;

Если КоличествоВТаблице > 0 Тогда

ЗаполнитьЗначенияСвойств(СтруктураПоиска, ТекСтрока);
НайденныеСтрокиБезЕдиниц = ТаблицаСВычетами.НайтиСтроки(СтруктураПоиска);

Если НайденныеСтрокиБезЕдиниц.Количество()>0 Тогда

Если ЕстьКоэффициент Тогда
Коэффициент = ТекСтрока.Коэффициент;
Иначе
Коэффициент = ТекСтрока[ЕдиницаИзмерения].Коэффициент;
КонецЕсли;

КоличествоВТаблицеБаза = КоличествоВТаблице * Коэффициент;

// Поиск свободного количества у других единиц
Для Каждого СтрокаТаблицы Из НайденныеСтрокиБезЕдиниц Цикл

Если КоличествоВТаблице = 0 Тогда
Прервать;
КонецЕсли;

Если СтрокаТаблицы.СвободноеКоличество = 0 Тогда
Продолжить;
КонецЕсли;

Если КоличествоВТаблицеБаза < СтрокаТаблицы.СвободноеКоличество Тогда
СтрокаТаблицы.СвободноеКоличество = СтрокаТаблицы.СвободноеКоличество - КоличествоВТаблицеБаза;
СтрокаТаблицы.Количество          = СтрокаТаблицы.Количество          - Окр(КоличествоВТаблицеБаза/СтрокаТаблицы.Коэффициент, 3, 1);
КоличествоВТаблицеБаза = 0;
Иначе
КоличествоВТаблицеБаза = КоличествоВТаблицеБаза - СтрокаТаблицы.СвободноеКоличество;
// количество под данную единицу в вычитаемых таблицах не задействована
Если СтрокаТаблицы.СвободноеКоличество = СтрокаТаблицы.Количество*СтрокаТаблицы.Коэффициент Тогда
ТаблицаСВычетами.Удалить(СтрокаТаблицы);
Иначе
СтрокаТаблицы.СвободноеКоличество = 0;
СтрокаТаблицы.Количество          = СтрокаТаблицы.Количество     - Окр(СтрокаТаблицы.СвободноеКоличество/СтрокаТаблицы.Коэффициент, 3, 1);
КонецЕсли;
КонецЕсли;
КонецЦикла;

// Здесь можно добавить код полного вычитания без учета свободного остатка по вычитаемым единицам.

КоличествоВТаблице = КоличествоВТаблицеБаза / Коэффициент;

КонецЕсли;

КонецЕсли;

Если КоличествоВТаблице = 0 Тогда
Продолжить;
КонецЕсли;

НоваяСтрока = Результат.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, ТекСтрока);

Если ТекСтрока[Количество] = 0 Тогда
КоэффициентКоличества = 0;
Иначе
КоэффициентКоличества = КоличествоВТаблице/ТекСтрока[Количество];
КонецЕсли;

Если ЕстьСумма Тогда
НоваяСтрока.Сумма       = ?(КоэффициентКоличества = 0, 0, ТекСтрока.Сумма*КоэффициентКоличества);
КонецЕсли;

Если ЕстьСуммаСкидки Тогда
НоваяСтрока.СуммаСкидки = ?(КоэффициентКоличества = 0, 0, ТекСтрока.СуммаСкидки*КоэффициентКоличества);
КонецЕсли;

Если ЕстьСуммаНДС Тогда
НоваяСтрока.СуммаНДС    = ?(КоэффициентКоличества = 0, 0, ТекСтрока.СуммаНДС*КоэффициентКоличества);
КонецЕсли;

Если ЕстьСуммаВсего Тогда
НоваяСтрока.СуммаВсего  = ?(КоэффициентКоличества = 0, 0, ТекСтрока.СуммаВсего*КоэффициентКоличества);
КонецЕсли;

Если ЕстьКоличествоБазовое Тогда
НоваяСтрока.КоличествоБазовое  = ?(КоэффициентКоличества = 0, 0, ТекСтрока.КоличествоБазовое*КоэффициентКоличества);
КонецЕсли;

Если ЕстьСуммаСкидкиСтроки Тогда
НоваяСтрока.СуммаСкидкиСтроки  = ?(КоэффициентКоличества = 0, 0, ТекСтрока.СуммаСкидкиСтроки*КоэффициентКоличества);
КонецЕсли;

КонецЦикла;

Возврат Результат;

КонецФункции // дкВычитаниеТаблиц()
 
Обновляться до 18 релиза буду, но позже.
спасибо.
Страницы: 1
Читают тему
Поддержка отраслевых решений «1С-Рарус»
Услуги 1С