Значит, есть еще другие способы получения этой ошибки, думаю не надо их все перебирать, а попробовать исправить. Рекомендую обновиться до 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, ТекСтрока.СуммаСкидкиСтроки*КоэффициентКоличества);
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции // дкВычитаниеТаблиц()