Имя: Пароль:
1C
1С v8
Помогите упростить задачу.
🠗 (Волшебник 02.04.2018 19:32)
,
0 Куникулус
 
02.04.18
19:20
Написал отчет но как-то слишком громзко получилось.

Задача такая.

Берем обороты контрагентов, есть счета контрагентов и есть корреспондирующие счета. Корреспондирующих счетов очень много, есть желание дать возможность выбирать какие кор. счета смотреть. На форме расположен список в котором галочками ведется отбор.

Задача заполнить СписокЗначений счетами которые выводить не нужно (или наоборот которыми нужно.)

Код примерно такой:

Перем сч;
Перем спСчетовРодителей;


СписокКоррСчета.Добавить("Прочие", "Прочие (96, 97 и т.п.)", Ложь);
СписокКоррСчета.Добавить("ДенежныеСредства", "Денежные средства (50, 51, 52)", Истина);
СписокКоррСчета.Добавить("ДенежныеСредстваДоп", "Денежные средства доп. (55, 57)", Истина);
СписокКоррСчета.Добавить("СРаботниками", "С работниками (70, 71, 73)", Истина);
СписокКоррСчета.Добавить("Учредители", "Денежные средства (75, 84, 86)", Истина);
СписокКоррСчета.Добавить("НалогиИВзносы", "Налоги и взносы (68, 69)", Истина);
СписокКоррСчета.Добавить("Взаимозачеты", "Взаимозачеты (60,62, 63, 66, 67, 76)", Истина);
СписокКоррСчета.Добавить("ЗакупкиТМЦ", "Закупки ТМЦ (08, 10, 41)", Истина);
СписокКоррСчета.Добавить("ЗатратыСебестоимость", "Затраты себестоимость (20, 23, 25, 26, 29)", Истина);
СписокКоррСчета.Добавить("ЗатратыКоммерческие", "Затраты коммерческие (44)", Истина);
СписокКоррСчета.Добавить("Выручка", "Выручка (90)", Истина);
СписокКоррСчета.Добавить("ПрочиеДиР", "Прочие доходы и расходы (91)", Истина);

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

/////////////////////////////////////////////////////////
ЗАполнение списка счетов:
Процедура ЗаполнитьСписокНеНеСчетов(Запрос)
    
    спПрочихНеСчетов = Новый СписокЗначений;
    Для Каждого элСчет из сч Цикл
        спПрочихНеСчетов.Добавить(элСчет.Значение, элСчет.Ключ);
    КонецЦикла;
                                         
    соотНеСчетов = Новый Структура;
    соотНеСчетов.Вставить("ДенежныеСредства", "Счет50, Счет51, Счет52");                       
    соотНеСчетов.Вставить("ДенежныеСредстваДоп", "Счет55, Счет57");       
    соотНеСчетов.Вставить("СРаботниками", "Счет70, Счет71, Счет73");       
    соотНеСчетов.Вставить("Учредители", "Счет75, Счет84, Счет86");       
    соотНеСчетов.Вставить("НалогиИВзносы", "Счет68, Счет69");       
    соотНеСчетов.Вставить("Взаимозачеты", "Счет60, Счет62, Счет63, Счет66, Счет67, Счет76");       
    соотНеСчетов.Вставить("ЗакупкиТМЦ", "Счет08, Счет10, Счет41");       
    соотНеСчетов.Вставить("ЗатратыСебестоимость", "Счет20, Счет23, Счет25, Счет26, Счет29");       
    соотНеСчетов.Вставить("ЗатратыКоммерческие", "Счет44");       
    соотНеСчетов.Вставить("Выручка", "Счет90");       
    соотНеСчетов.Вставить("ПрочиеДиР", "Счет91");       
    
        
    спНеПрочихСчетов = Новый Массив;
    Для Каждого элСтНесчето из соотНеСчетов Цикл
        Для Каждого элМассСтНесчетов из ПолучитьМассивСчетовИзСтр(элСтНесчето.Значение) Цикл
            элСППрочихНеСчетов = спПрочихНеСчетов.НайтиПоЗначению(элМассСтНесчетов);
            Если элСППрочихНеСчетов <> Неопределено Тогда
                спПрочихНеСчетов.Удалить(элСППрочихНеСчетов);
            КонецЕсли;
        КонецЦикла;
    КонецЦИкла;
    
    стрПрочихНеСчетов = "";
    Для Каждого элмСпПрочихНеСчетов из спПрочихНеСчетов Цикл
        стрПрочихНеСчетов = стрПрочихНеСчетов + элмСпПрочихНеСчетов.Представление+", ";
    КонецЦикла;
    
    соотНеСчетов.Вставить("Прочие", стрПрочихНеСчетов);
    
    спНеКоррСчетов = Новый СписокЗначений;
    Для каждого элмСпКонтр из СписокКоррСчета Цикл
        Если не элмСпКонтр.Пометка Тогда
            ТекСчет = "";
            соотНеСчетов.Свойство(элмСпКонтр.Значение, ТекСчет);
            Для Каждого элМассСтНесчетов из ПолучитьМассивСчетовИзСтр(ТекСчет) Цикл
                спНеКоррСчетов.Добавить(элМассСтНесчетов);
            КонецЦикла;
        КонецЕсли;
    КонецЦикла;
    
    Запрос.УстановитьПараметр("спНеКоррСчетов", спНеКоррСчетов);
    
КонецПроцедуры

////////////////////////////////////////////////////


Функция ПолучитьМассивСчетовИзСтр(СтрокаСосчетами)
    
    массРезульт  = Новый Массив;
    
    массСчетаСтр = РазложитьСтрокуВМассивПодстрок(СтрокаСосчетами,",");
    
    Для Каждого элМасСчСтр Из массСчетаСтр Цикл
        Если СС(элМасСчСтр)<>"" тогда
            ТекСчет = сч.СчетПустой;
            Если сч.Свойство(СС(элМасСчСтр), ТекСчет)<>Неопределено Тогда
                массРезульт.Добавить(ТекСчет);
                
                элмСпРодителей = спСчетовРодителей.НайтиПоЗначению(ТекСчет);
                Если элмСпРодителей<>Неопределено Тогда
                    МассДопСчетов = ПолучитьМассивСчетовИзСтр(элмСпРодителей.Представление);
                    Для Каждого элмМассДопСчетов из МассДопСчетов Цикл
                        массРезульт.Добавить(элмМассДопСчетов);
                    КонецЦИкла;
                КонецЕсли;
                
            КонецЕсли;
        КонецеСЛи;
    КонецЦикла;
        
    Возврат массРезульт;

КонецФункции
1 Волшебник
 
02.04.18
19:28
пишется "громоздко"
2 xXeNoNx
 
02.04.18
19:29
(0) работает - не трогай!
3 Куникулус
 
02.04.18
19:30
(1) Где так пишется? В Израиле? Ну так мы в России живем.
4 Волшебник
 
02.04.18
19:31
(3) В России так пишется.
5 shuhard
 
02.04.18
19:32
(3) а казачок то засланный (с)
6 Волшебник
 
02.04.18
19:32
(5) Да, IP левый
7 xXeNoNx
 
02.04.18
19:33
(0) описанная задача не упрощается!
8 Куникулус
 
02.04.18
19:34
(5) Ты меня раскрыл. Всё пропало? Что меня выдало?
9 Куникулус
 
02.04.18
19:34
(7) решение упростить
10 Волшебник
 
02.04.18
19:35
(8) Тебя выдал парашют за спиной.
11 VS-1976
 
02.04.18
20:34
ССылка.Родитель это можно и в запрос закинуть, а не генерировать запросы в цикле...
Код действительно мутный, кручу верчу. Не понимаю зачем тебе всё это действо? Как минимум в СписокЗначений и Структуру можно в виде значения и массив запихнуть со значениями и не нужен этот лютый парсинг...
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший