При закрытии подписчики были переданы в рассылку "В помощь бухгалтеру" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
Информационный Канал 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
Поддержка подписчиков Другие рассылки этой тематики Другие рассылки этого автора |
Подписан адрес:
Код этой рассылки: inet.review.cool1c |
Отписаться
Вспомнить пароль |
В избранное | ||