Вход | Регистрация

1С:Предприятие :: 1С:Предприятие 8 общая

Помогите упростить задачу.

↓ [Волшебник, 02.04.18 - 19:32]
Помогите упростить задачу.
Я
   Куникулус
 
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
пишется "громоздко"
   xXeNoNx
 
2 - 02.04.18 - 19:29
(0) работает - не трогай!
   Куникулус
 
3 - 02.04.18 - 19:30
(1) Где так пишется? В Израиле? Ну так мы в России живем.
   Волшебник
 
4 - 02.04.18 - 19:31
(3) В России так пишется.
   shuhard
 
5 - 02.04.18 - 19:32
(3) а казачок то засланный (с)
   Волшебник
 
6 - 02.04.18 - 19:32
(5) Да, IP левый
   xXeNoNx
 
7 - 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) Тебя выдал парашют за спиной.
 
 Рекламное место пустует
   VS-1976
 
11 - 02.04.18 - 20:34
ССылка.Родитель это можно и в запрос закинуть, а не генерировать запросы в цикле...
Код действительно мутный, кручу верчу. Не понимаю зачем тебе всё это действо? Как минимум в СписокЗначений и Структуру можно в виде значения и массив запихнуть со значениями и не нужен этот лютый парсинг...

Список тем форума
Рекламное место пустует  Рекламное место пустует
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство.
Фредерик Брукс-младший
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует