Отправляет email-рассылки с помощью сервиса Sendsay

1С: грабли, камни и бриллианты

  Все выпуски  

1С: грабли, камни и бриллианты 62 выпуск


Информационный Канал Subscribe.Ru

Здравствуйте, уважаемые!

Вашему взору представлена рассылка "1С: грабли, камни и бриллианты" и ее ведущий: Железняков Юрий.


Выпуск 62

 

Настоящий философ всегда говорит, что думает, поэтому больше молчит. (c) Sj

 

   И года не прошло, а перед вами на экране монитора новый выпуск рассылки, которая спешит в каждый дом, чтобы сделать работу

на 1С приятной удобной и скорой – в жизни всегда есть место чуду.

 

Уважаемый Железняков Юрий, очень интересно читать вашу рассылку. Особенно интересно зелёному "математикуистемному программеру", пару месяцев назад отучившемуся в университете. Одна лишь вещь повергает меня в недоумение: после 51 выпуска сразу следует 60. В связи с чем возникает опять же недоуменный вопрос: а что же случилось с 52, 53, 54, 55, 56, 57, 58 и 59? Нет ли какого заговора против ваших читателей :) ? Ответьте страждущим определенности.

Заранее спасибо.

 

   Спешу ответить на данный вопрос: заговор против читателей нашей всеми любимой рассылки действительно существует, и я подозревал об этом давно, но не решался высказаться вслух. Сдается мне, что организован он авторами других рассылок, которых в последнее время развелось так много, что мало не покажется.

   Отдельно спешу ответить, что в рассылках под номерами 52, 53, 54, 55, 56, 57, 58 и 59 были ответы на самые наболевшие ответы наших читателей. Увы, авторские копии выкраны конкурирующими организациями и проданы заграницу за очень большие деньги ( во всяком случае мне так кажется).

 

 

   Давайте сегодня неторопливо порешаем следущую задачку.

   Сама задача в формулировке выглядит простой, незатейливой, но ее решение, например у меня вызвало определенные трудности.

Задача для ТиС:

   Определить количество клиентов купивших товар из какой-то определенной группы, то есть

Товар1, Товар2 принадлежат группе ГруппаТовара1. Вопрос: сколько клиентов купило товар из ГруппаТовар1.

 

Вся проблема упирается в то, что Клиент1 может купить Товар1 и Товар2.  И тогда по группеТовара1 должно быть значение 1, а не 2.

Воспользуемся запросом.

Данные запроса выгрузим в таблицу значений.

И далее с таблицей значений проманипулируем так, чтобы получить требуемые цифры.

 

Решение этой проблемы расположено ниже ( примерный набросочный код ):

 

Функция Distinct(Знач ТЗ1,ТЗ2)

  ТЗ1.НоваяКолонка("Колво","Число",15);

  ТЗ2.ВыбратьСтроки();

  ТЗ2.ПолучитьСтроку();

  Уровень = ТЗ2.Перваяровень();

  Пока Уровень<>0 Цикл

    Уровень = Уровень -1;

    Для Сц = 1 По ТЗ2.КоличествоСтрок() Цикл

         ТЗ2.УстановитьЗначение(Сц, 1, ТЗ2.ПолучитьЗначение(Сц,1).Родитель);

    КонецЦикла;  

    ТЗ2.Свернуть("Первая,Вторая","Колво");

    ТЗ2.ВыбратьСтроки();

    Пока ТЗ2.ПолучитьСтроку()=1 Цикл

         Если ТЗ2.Колво >0 Тогда

            ТЗ1.НоваяСтрока();

            ТЗ1.Первая = ТЗ2.Первая;

            ТЗ1.Колво  = 1;

        КонецЕсли; 

    КонецЦикла;  

  КонецЦикла;    

  ТЗ1.Свернуть("1","Сумма, Колво");

// начало подготовки к сортировке             

  ТЗ1.НоваяКолонка("Сортировка","Строка");

  ТЗ1.ВыбратьСтроки();

  Пока ТЗ1.ПолучитьСтроку()=1 Цикл

      ТЗ1.Сортировка = ?(ТЗ1.Перваяровень()=1, Строка(ТЗ1.Первая.Код),Строка(ТЗ1.Первая.Родитель.Код)+Строка(ТЗ1.Первая.Код));

  КонецЦикла;    

  ТЗ1.Сортировать("Сортировка");

// отсортировались наконец то                 

  Для Сц = 1 По ТЗ1.КоличествоСтрок() Цикл

      ТЗ1.ПолучитьСтрокуПоНомеру(Сц);

     Сообщить(?(ТЗервая.Уровень()=2,"    ","")+СокрЛП(ТЗ.Первая.Уровень())+")"+СокрЛП(ТЗ.Первая)+ "*-*" + Формат(ТЗ.Сумма,"Ч015.2, ") + "*-* " + Формат(ТЗ.Колво,"Ч010.0, "));

  КонецЦикла;    

  Сообщить("------------------------"); 

  Возврат ТЗ1;

КонецФункции

 

Процедура Сформировать()   

  Запрос = СоздатьОбъект("Запрос");

  ТекстЗапроса =

 "Период с Дата1 по Дата2;

                |ОбрабатыватьДокументы Проведенные;

                |Товар  = ДокументасходнаяНакладная.Товар;

                |Клиент = ДокументасходнаяНакладная.Клиент;

                |Сумма  = ДокументасходнаяНакладная.Сумма;                  

                |Группировка Товар;

                |Группировка Клиент без групп;

                |Функция ФСуммаРасх     = Сумма(Сумма);

                |Условие (Сумма<>0);";

                ТЗСум =  СоздатьОбъект("ТаблицаЗначений");

                ТЗСумоваяКолонка("Первая");

                ТЗСумоваяКолонка("Сумма","Число",15,2,);

                ТЗКол =  СоздатьОбъект("ТаблицаЗначений");

                ТЗКоловаяКолонка("Первая");

                ТЗКоловаяКолонка("Вторая");

                ТЗКоловаяКолонка("Колво"); // можно без этого столбика, но если запрос проводится по нескольким датам

                Запросыполнить(ТекстЗапроса);

                Пока Запросруппировка(1) = 1 Цикл    

                               Если ЗапростоГруппа(1) = 1 Тогда

                    ТЗСумоваяСтрока();

      ТЗСумервая = Запрос.Товар;

                                               ТЗСумумма  = Запрос.ФСуммаРасх;

                                               Продолжить;

                               КонецЕсли;         

                  Пока Запросруппировка(2) = 1 Цикл 

                    ТЗКоловаяСтрока();

      ТЗКолервая = Запрос.Товар;

                    ТЗКолторая = Запрос.Клиент;

                                               ТЗКололво  = 1;// можно без этого столбика

                 КонецЦикла;                     

                КонецЦикла;      

  ТЗСум = Distinct(ТЗСумЗКол);

КонецПроцедуры

 

 

После многочисленных дней отладки данного кода программа преобразилась к следующему виду:

 

Функция Distinct(ТЗ0)

                ТЗ =  СоздатьОбъект("ТаблицаЗначений");

                ТЗоваяКолонка("Первая");

                ТЗоваяКолонка("Вторая");

                ТЗоваяКолонка("Сумма","Число",15,2);

                ТЗоваяКолонка("Колво","Число",5);      

                Уровень = ТЗ0.ПолучитьЗначение(1,1).Уровень();

                Пока Уровень<>0 Цикл

                               Уровень = Уровень -1;

                  Для Сц = 1 По ТЗ0.КоличествоСтрок() Цикл

                                 ТЗ0.УстановитьЗначение(Сц, 1, ТЗ0.ПолучитьЗначение(Сц,1).Родитель);

                  КонецЦикла;    

                  ТЗ0.Свернуть("1,2","ФСумма");

                  ТЗ0.ВыбратьСтроки();

                  Пока ТЗ0.ПолучитьСтроку()=1 Цикл

                                               Если ТЗ0.ФСумма>0 Тогда

                                   ТЗоваяСтрока();

                                                 ТЗервая = ТЗ0.Первая;

                                                 ТЗолво  = 1;

                                                 ТЗумма  = ТЗ0.ФСумма;

                                               КонецЕсли;         

                  КонецЦикла;    

                КонецЦикла;      

                ТЗвернуть("1","Сумма, Колво");

// отсортируем

                ТЗоваяКолонка("Сортировка","Строка");

                ТЗыбратьСтроки();

                Пока ТЗолучитьСтроку()=1 Цикл

                               ТЗортировка = ?(ТЗ.Первая.Уровень()=1, Строка(ТЗ.Первая.Код), Строка(ТЗ.Первая.Родитель.Код)+Строка(ТЗ.Первая.Код));

                КонецЦикла;      

                ТЗортировать("Сортировка");

                Для Сц = 1 По ТЗоличествоСтрок() Цикл

                               ТЗолучитьСтрокуПоНомеру(Сц);

                               Сообщить(?(ТЗервая.Уровень()=2,"    ","")+СокрЛП(ТЗ.Первая.Уровень())+")"+СокрЛП(ТЗ.Первая)+ "*-*" + Формат(ТЗ.Сумма,"Ч015.2, ") + "*-* " + Формат(ТЗ.Колво,"Ч010.0, "));

                КонецЦикла;      

  Сообщить("------------------------"); 

                Возврат ТЗ;

КонецФункции

 

Процедура Сформировать()   

  Запрос = СоздатьОбъект("Запрос");

  ТекстЗапроса =

 "Период с Дата1 по Дата2;ОбрабатыватьДокументы Проведенные;Первая=ДокументасходнаяНакладная.Товар;Клиент=Документ.РасходнаяНакладная.Клиент;

                |Сумма  = ДокументасходнаяНакладная.Сумма;Без Итогов;Группировка Первая без групп;Группировка Клиент без групп;Функция ФСумма = Сумма(Сумма);";

                ТЗ =  СоздатьОбъект("ТаблицаЗначений");

                Запросыполнить(ТекстЗапроса);

                Запросыгрузить(ТЗ);

  ТЗСум = Distinct(ТЗ);

КонецПроцедуры

 

 

   После получения данной сверки таблицу значения можно вывести в какой-нибудь отчет. И все будут довольны.

 

 

Ну вот, вроде написал всё, что было написать. А что не смог, знать никому и не нужно.

 

Пишите мне о том, что вы хотели бы знать, но,  не захотели найти ответ в книге.

 

В письме не забудьте,  пожалуйста, указать версию 1С, релиз и ОС на компьютере. Это поможет!

 

Не бойтесь задавать вопросы!

Приветствуются любые предложения и пожелания.

 

Во избежание недоразумений ваши письма должны иметь явное указание на запрещение публикации их в рассылке.

По умолчанию считается, что письмо публиковать разрешено.

Если вы в теле письма указали адрес, я буду его тоже указывать, но специально из реквизитов письма адрес извлекаться не будет, это весьма трудоемкая и нетривиальная задача.

 

До встречи, господа программисты и просто господа!

 

Написать ведущему Sj

 

Адрес рассылки:      http://subscribe.ru/catalog/inet.review.cool1c

Архив рассылки:     http://subscribe.ru/archive/inet.review.cool1c

Рассылки Subscribe.Ru
1С: грабли, камни и бриллианты

Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: inet.review.cool1c
Отписаться
Вспомнить пароль

В избранное