Функция ПроверкаНаДублиСтрок(Ссылка, ИмяТаблЧасти = "Товары", Колонка = "Товар", Колонка2 = "", Отказ = Ложь, Заголовок = "") Экспорт ИмяДока = Ссылка.Метаданные().Имя; ЕстьДополнительно = Колонка2 <> ""; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Док." + Колонка + " КАК ID, | ПРЕДСТАВЛЕНИЕ(Док." + Колонка + ") КАК Сверка," + ?(ЕстьДополнительно," | ПРЕДСТАВЛЕНИЕ(Док." + Колонка2 + ") КАК Сверка2,", "") + " | Док.НомерСтроки КАК НомерСтроки, | ДокКопия.НомерСтроки КАК НомерСтрокиКопия |ИЗ | Документ." + ИмяДока + "." + ИмяТаблЧасти + " КАК Док | СОЕДИНЕНИЕ Документ." + ИмяДока + "." + ИмяТаблЧасти + " КАК ДокКопия | ПО Док." + Колонка + "= ДокКопия." + Колонка + " | И Док.НомерСтроки < ДокКопия.НомерСтроки" + ?(ЕстьДополнительно," | И Док." + Колонка2 + "= ДокКопия." + Колонка2, "") + " |ГДЕ | Док.Ссылка = &Ссылка | И ДокКопия.Ссылка = &Ссылка | |УПОРЯДОЧИТЬ ПО | ID, | НомерСтроки"; Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить().Выбрать(); ЕстьДубль = Ложь; СтрокаСообщения = "Проверка табличной части на дублирующиеся строки: |Обнаружены одинаковые позиции! Колонк" + ?(ЕстьДополнительно, "и: " +Колонка +" и " + Колонка2, "а: "+ Колонка); Пока Результат.Следующий() Цикл Если ЕстьДополнительно Тогда Значение = СокрП(Результат.Сверка)+ ", " + Результат.Сверка2; Иначе Значение = Результат.Сверка; КонецЕсли; СтрокаСообщения = СтрокаСообщения + Символы.ПС + "Строка № " + Формат(Результат.НомерСтроки, "ЧГ=") + " и строка № " + Формат(Результат.НомерСтрокиКопия, "ЧГ=") + " значение: " + Значение; ЕстьДубль = Истина; КонецЦикла; Если ЕстьДубль Тогда обСообщитьОбОшибке(СтрокаСообщения, Отказ, Заголовок); КонецЕсли; Возврат Отказ; КонецФункции
МассивКолонок = Новый Массив; МассивКолонок.Добавить("Количество"); СсылочныеКолонки = Новый Соответствие; СсылочныеКолонки["Адрес"] = Справочники.АдресаЯчеек.ПустаяСсылка(); СсылочныеКолонки["Товар"] = Справочники.Номенклатура.ПустаяСсылка(); ПроверкаЗаполненияТабличнойЧасти(Ссылка, "Товары", МассивКолонок, СсылочныеКолонки, Отказ); //выбирает не заполненные строки //СсылкаНаОбъект - ссылка на проверяемый документ, ИмяТабЧасти - имя проверяемой табличной части, //СписокКолонок - массив с именами колонок //СсылочныеКолонки - соответсвие имен колонок и пустых ссылок типов этих колонок Процедура ПроверкаЗаполненияТабличнойЧасти(СсылкаНаОбъект, ИмяТабЧасти = "Товары", СписокКолонок, СсылочныеКолонки = Неопределено, Отказ = Ложь, Заголовок = "") Экспорт ИмяДока = СсылкаНаОбъект.Метаданные().Имя; Запрос = Новый Запрос; Запрос.УстановитьПараметр("Ссылка", СсылкаНаОбъект); ТекстЗапроса = "ВЫБРАТЬ | Док.НомерСтроки |ИЗ | Документ." + ИмяДока + "." + ИмяТабЧасти + " КАК Док |ГДЕ | Док.Ссылка = &Ссылка И ("; СтрокаКолонок = ""; Если СсылочныеКолонки <> Неопределено Тогда Для каждого Колонка Из СсылочныеКолонки Цикл ТекстЗапроса = ТекстЗапроса + " Док." + Колонка.Ключ + " = &" + Колонка.Ключ + " ИЛИ"; СтрокаКолонок = СтрокаКолонок + Колонка.Ключ + ", "; Запрос.УстановитьПараметр(Колонка.Ключ, Колонка.Значение); КонецЦикла; КонецЕсли; Для каждого Колонка Из СписокКолонок Цикл ТекстЗапроса = ТекстЗапроса + " Док." + Колонка + " = 0 ИЛИ"; СтрокаКолонок = СтрокаКолонок + Колонка + ", "; КонецЦикла; ТекстЗапроса = СтрЗаменить(ТекстЗапроса, Колонка + " = 0 ИЛИ", Колонка + " = 0)"); Запрос.Текст = ТекстЗапроса; СтрокаСообщения = "Проверка табличной части на заполнение по колонкам: " + СтрокаКолонок; Результат = Запрос.Выполнить().Выбрать(); ЕстьОшибки = Ложь; Пока Результат.Следующий() Цикл СтрокаСообщения = СтрокаСообщения + Символы.ПС + "В строке № " + Формат(Результат.НомерСтроки, "ЧГ=0") + " есть не заполненное значение!"; ЕстьОшибки = Истина; КонецЦикла; Если ЕстьОшибки Тогда СообщитьОбОшибке(СтрокаСообщения, Отказ, Заголовок); КонецЕсли; КонецПроцедуры