Форум программистов, компьютерный форум CyberForum.ru

1С: Собственные программы

Войти
Регистрация
Восстановить пароль
 
MonteKristo
55 / 55 / 16
Регистрация: 21.08.2015
Сообщений: 212
#1

1C 8.x Как лучше сделать проверку на дубли? - 1С

19.12.2016, 15:34. Просмотров 208. Ответов 1
Метки нет (Все метки)

Доброго времени. Написал обработку, смысл следующий:
1) Пользователь открывает ее в конфигурации бух 2.0.
2) Открывается формы с таблицой значений
3) Заполняем на форме дату начала и дату конца отбора
4) Нажимаем на форме кнопку "заполнить"
5) За выбранный период формируется список счетов на оплату
6) Галочками отбираем нужные
7) Заполняем на форме реквизит "Период выписки"
8) Нажимаем на форме кнопку "Создать счета на оплату"
9) Отмеченные галочкой счета берут и копируются только с текущей датой и в комментарий вставляется период выписки.
10) При этом на жестком диске создаются эти счета в форматах xls и pdf

Если делать разово, то все отрабатывает, а вот когда уже есть скопированные документы, то тут начинаются проблемы:
1) Если есть дубли, то обработка их проходит, пропуска, затем берет документ, которого еще нет в базе и создает, но на жесткий диск не сохраняет.
2) Если есть дубли, то программа оповещает об этом и выдает ошибку: {ВнешняяОбработка.Счета.Форма.Форма.Форма(761)}: Преобразование значения к типу Булево не может быть выполнено
СуммаКПрописи = Сумма + ?(Шапка.СуммаВключаетНДС, 0, СуммаНДС); это при обращении к процедуре сохранить. Ее код - это стандартный код формирования счета на оплату(из типовой бух 2.0), только в конце дописана сохранялка на жесткий диск.


1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
Процедура ОсновныеДействияФормыСоздатьСчетаНаОплату(Кнопка)
    
    МассивОтобранныхДокументов = ПолучитьВыбранныеДокументы(); //Отобранные пользователем докумнеты на форме обработки
 
УжеСозданныеСчета = МассивСчетов();  //Это массив всех существующих счетов
МассивСозданныхДокументов = Новый Массив; 
 
Для Каждого ЭлементМассива Из МассивОтобранныхДокументов Цикл
 
                ДокументКопия = ЭлементМассива.Скопировать();
        ДокументКопия.Дата = НоваяДатаДок;
        ДокументКопия.Комментарий = НовыйКомментарий;
 
Для Каждого Счет ИЗ УжеСозданныеСчета Цикл
            
            Если ДокументКопия.Контрагент = Счет.Контрагент И 
                ДокументКопия.СуммаДокумента = Счет.СуммаДокумента И
                ДокументКопия.Комментарий = Счет.Комментарий Тогда
                
                Сообщить("Документ на основании счета № " + ЭлементМассива.Номер + " " + ЭлементМассива.Дата + " был создан ранее.");
                Сообщить("Документ не создан");
                
                ДокументКопия.Удалить();
                
            ИначеЕсли (ДокументКопия.Контрагент <> Счет.Контрагент И    //Мне не понятно почему, но когда падает в эту ветку, то первую ссылку на документ прогоняет два раза, затем идет на следующий и там по уже все нормально.
                ДокументКопия.СуммаДокумента = Счет.СуммаДокумента И
                ДокументКопия.Комментарий = Счет.Комментарий) ИЛИ
                (ДокументКопия.Контрагент = Счет.Контрагент И 
                ДокументКопия.СуммаДокумента <> Счет.СуммаДокумента И
                ДокументКопия.Комментарий = Счет.Комментарий) ИЛИ
                (ДокументКопия.Контрагент = Счет.Контрагент И 
                ДокументКопия.СуммаДокумента = Счет.СуммаДокумента И
                ДокументКопия.Комментарий <> Счет.Комментарий) Тогда
                
                
                ДокументКопия.Записать();
                
            КонецЕсли;
        КонецЦикла;
        
        МассивСозданныхДокументов.Добавить(ДокументКопия.Ссылка); //В этот массив попадают документы новые, не дубли.
        
    КонецЦикла;
 
 
//Далее запускается функция сохранения счетов, по ссылке формируется счет и сохраняется в форматы excel и pdf.
 
Для Каждого ЭлементГотовый Из МассивСозданныхДокументов Цикл   
        СохранениеСчетов = СохранитьСчетНаОплату(ЭлементГотовый);
    КонецЦикла;
    
КонецПроцедуры
Написал очень сумбурно все, но как то так все и есть. Голову уже сломал с этой проверкой на дубли, может есть способ попроще? Или по умнее что ли. Скрин обработки тоже выложу, дабы нагляднее было.
Миниатюры
Как лучше сделать проверку на дубли?  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.12.2016, 15:34     1C 8.x Как лучше сделать проверку на дубли?
Посмотрите здесь:
Как лучше сделать чтобы компьютер учитывался по частям (т.е. материнка, БП, процессор...)? 1С 1C 7.x
Не могу правильно вывести проверку ответа 1С
C# Как лучше реализовать проверку аргумента?
Delphi БД Как лучше организовать проверку введённого значения?
Java SE Как сделать проверку
как сделать проверку Delphi
Как сделать проверку JavaScript
как сделать проверку? Delphi
Как сделать проверку if ... then Delphi
PascalABC.NET Как сделать проверку ?
Как сделать проверку подключения бд? C#
PHP ООП Как сделать проверку метода ?

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
renat_dmitriev
93 / 93 / 26
Регистрация: 26.08.2016
Сообщений: 308
19.12.2016, 19:27     1C 8.x Как лучше сделать проверку на дубли? #2
В первую очередь алгоритм проверки лишен логики начисто. Вы сначала проверьте в цикле есть у вас такой счет или нет и потом уже за пределами цикла перебора счетов создавайте и записывайте копию в случае если это нужно. А так получается счета разные и могут удовлетворять разным условиям, но работаете вы с одним и тем же объектом ДокументКопия, что абсолютно нелогично.

ДокументКопия.Записать(); должно быть за пределами цикла

По поводу ошибки в обработке - проверьте какой тип значения у переменной Шапка, видимо алгоритм перенесен из типовой не совсем верно.
Yandex
Объявления
19.12.2016, 19:27     1C 8.x Как лучше сделать проверку на дубли?
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru