Доброго времени. Написал обработку, смысл ее в том, что открывается форма, в ней указывается период и на основании этого периода отбираются документы счета на оплату, далее галочками отмечаются нужные, еще в одном поле формы указывается месяц выписки, затем нажимаем кнопку скопировать и происходит копирование счетов и в созданных счетах, в поле комментарий прописывается месяц выписки. Все это отрабатывает, но проблема в том, что не могу отследить дубли, то есть как я понимаю, перед копированием нужно проверять что то типа
тогда не копировать, но не могу понять как отловить создаваемый документ. У меня идет
То есть он уже создается, а как можно его отловить до создания?
Или может есть более удобный метод проверки на дубли?
Если СоздаваемыйДокумент.Контрагент = УжеСозданныйДокумент.Контрагент и СоздаваемыйДокумент.Комментарий = УжеСозданныйДокумент.Комментарий
тогда не копировать, но не могу понять как отловить создаваемый документ. У меня идет
ДокументКопия = ЭлементМассива.Скопировать();
То есть он уже создается, а как можно его отловить до создания?
Или может есть более удобный метод проверки на дубли?
По теме из базы знаний
- Автоматизированная проверка конфигураций… и пара слов о стандартах разработки
- Как управлять качеством кода 1С, используя платформу SonarQube
- Не спеша, эффективно и правильно – путь разработки. Часть 2. Теория
- Как контролировать качество внешних обработок, отчетов, правил обмена, расширений 1С и поставить это на поток
- Технологии и преимущества разработки решений на общем коде. Как разрабатывается 1С:РМК, 1C:Розница и 1С:УНФ
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Доброго времени. Спасибо всем кто откликнулся, я еще две недели пытался сделать эту проверку. Вроде как работает, а вроде как и нет.
Вот код с комментариями:
Я уже просто запутался во всем этом. Буду рад если обратите внимание и поможете советом, как правильно сделать эту самую обработку.
Вот код с комментариями:
Процедура ОсновныеДействияФормыСоздатьСчетаНаОплату(Кнопка)
МассивОтобранныхДокументов = ПолучитьВыбранныеДокументы(); //Отобранные пользователем докумнеты на форме обработки
УжеСозданныеСчета = МассивСчетов(); //Это массив всех существующих счетов
МассивСозданныхДокументов = Новый Массив;
Для Каждого ЭлементМассива Из МассивОтобранныхДокументов Цикл
ДокументКопия = ЭлементМассива.Скопировать();
ДокументКопия.Дата = НоваяДатаДок;
ДокументКопия.Комментарий = НовыйКомментарий;
Для Каждого Счет ИЗ УжеСозданныеСчета Цикл
Если ДокументКопия.Контрагент = Счет.Контрагент И
ДокументКопия.СуммаДокумента = Счет.СуммаДокумента И
ДокументКопия.Комментарий = Счет.Комментарий Тогда
Сообщить("Документ на основании счета № " + ЭлементМассива.Номер + " " + ЭлементМассива.Дата + " был создан ранее.");
Сообщить("Документ не создан");
ДокументКопия.Удалить();
ИначеЕсли (ДокументКопия.Контрагент <> Счет.Контрагент И //Мне не понятно почему, но когда падает в эту ветку, то первую ссылку на документ прогоняет два раза, затем идет на следующий и там по уже все нормально.
ДокументКопия.СуммаДокумента = Счет.СуммаДокумента И
ДокументКопия.Комментарий = Счет.Комментарий) ИЛИ
(ДокументКопия.Контрагент = Счет.Контрагент И
ДокументКопия.СуммаДокумента <> Счет.СуммаДокумента И
ДокументКопия.Комментарий = Счет.Комментарий) ИЛИ
(ДокументКопия.Контрагент = Счет.Контрагент И
ДокументКопия.СуммаДокумента = Счет.СуммаДокумента И
ДокументКопия.Комментарий <> Счет.Комментарий) Тогда
ДокументКопия.Записать();
КонецЕсли;
КонецЦикла;
МассивСозданныхДокументов.Добавить(ДокументКопия.Ссылка); //В этот массив попадают документы новые, не дубли.
КонецЦикла;
//Далее запускается функция сохранения счетов, по ссылке формируется счет и сохраняется в форматы excel и pdf. Но есть одно но: если обработка отслеживает дубли,то выдается ошибка. {ВнешняяОбработка.Счета.Форма.Форма.Форма(761)}: Преобразование значения к типу Булево не может быть выполнено
СуммаКПрописи = Сумма + ?(Шапка.СуммаВключаетНДС, 0, СуммаНДС); это при обращении к процедуре сохранить. Ее код - это стандартный код формирования счета на оплату, только в конце дописано чтобы сохранялось на жесткий диск.
Для Каждого ЭлементГотовый Из МассивСозданныхДокументов Цикл
СохранениеСчетов = СохранитьСчетНаОплату(ЭлементГотовый);
КонецЦикла;
КонецПроцедуры
ПоказатьЯ уже просто запутался во всем этом. Буду рад если обратите внимание и поможете советом, как правильно сделать эту самую обработку.
(5) Не-не-не... Не надо так делать. Не стоит притягивать на сервер предприятия все счета и проверять их в цикле. Правильнее отослать массив на сервер SQL (даже если база файловая), и сравнить запросом. Да и связь по Контрагент, Сумма и Комментарий не вполне себе надёжная.
ДокументКопия = ЭлементМассива.Скопировать();
ДокументКопия.Дата = НоваяДатаДок;
ДокументКопия.Комментарий = НовыйКомментарий;
Для Каждого Счет ИЗ УжеСозданныеСчета Цикл
Если ДокументКопия.Контрагент = Счет.Контрагент И ...
Не вижу где ты определяешь переменную ДокументКопия.Контрагент
Обычно отслеживаю уникальность создания чего-либо через Соответствие (если идет поиск по одному ключу) или через ТЗ.
Если идет поиск по неск ключам, то примерно так:
Если идет поиск по неск ключам, то примерно так:
Процедура СкопироватьДоки()
// поля, уникальность которых нужно отслеживать
ПоляПоиска = "Договор, ОО";
Фильтр = Новый Структура(ПоляПоиска);
// создаем ТЗ для отслеживания уникальности
Уникальность = Новый ТаблицаЗначений;
Уникальность.Колонки.Добавить("Договор");
Уникальность.Колонки.Добавить("ОО");
Уникальность.Индексы.Добавить(ПоляПоиска);
// цикл по каким-то данным, где есть одноименные ключевые поля
Для Каждого ТекСтрока Из БазовыеРасчеты Цикл
// заполняем фильтр данными поиска
ЗаполнитьЗначенияСвойств(Фильтр, ТекСтрока);
// ищем в ТЗ уникальности
Если Уникальность.НайтиСтроки().Количество()<>0 Тогда // уже такие данные есть, пропускаем дальнейший код цикла
Продолжить;
КонецЕсли;
Док = ....; // создаем документ
ЗаполнитьЗначенияСвойств(Уникальность.Добавить(), Фильтр); // добавляем запись в ТЗ уникальности
КонецЦикла;
КонецПроцедуры
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот