Помогите начинающему)

Тема в разделе "1C и всё что с ней связано", создана пользователем CkoPnuK, 11 дек 2008.

  1. CkoPnuK

    CkoPnuK Гость

    Всем привет!
    Значит вот пришлось по ходу изучать 1С...
    Нигде не могу найти как для конкретного контрагента найти все его счета?

    если описать задачку поподробнее, то звучать она будет, приметно, так:
    Вывести список всех контрагентов. Если в заданный период попадают счета, то выводить их.
    ЗЫ: у меня это организованно в форме дерева, т.е. если у контрагента есть счет(а), то вывожу ветки...
    пока что это выполняется двумя запросами, что очень долго....

    Так же не разобрался с вопросом: как найти у заданного счета акт (Документ.ОказаниеУслуг)... у них вообще связей не нашел :(

    Если нужны еще какие-то пояснения, примеры моего кода - пишите.
    Спасибо всем, кто откликнется и поможет заранее ;)
     
  2. KiR

    KiR НЕ шибка опытный програмер)
    1C Team

    Регистрация:
    11 сен 2007
    Сообщения:
    1.581
    Симпатии:
    0
    Как-то сумбурно изложил проблему. Даже не указал платформы. Черным запросом пользоваться умеешь?
     
  3. CkoPnuK

    CkoPnuK Гость

    Дико извиняюсь!!!!
    Когда пиал. хотел вконце написать, но отвлекли и забылось....
    Платформа 1С: Бухгалтерия 7.7(файл-серверная весия) 7.70.027

    Т.е. черный запрос?
     
  4. KiR

    KiR НЕ шибка опытный програмер)
    1C Team

    Регистрация:
    11 сен 2007
    Сообщения:
    1.581
    Симпатии:
    0
    ну в 7,7 есть такое понятие как черный запрос. можешь в синтак помошнике почитать что такое объект ЗАПРОС. и посмотреть как он строиться из конструктора.
    а так же попробуй описать вообще свою проблему понятно, чтобы можно было тебе более адекватный совет дать
     
  5. CkoPnuK

    CkoPnuK Гость

    хм.... попробую тогда описать так:
    Значит организация, в которой я это пишу работает на самописной программе (написано на С#), в которую нужно уже вносить кучу изменений, а текстов программы не осталось. К тому же бухгалтерия работает на 1С и ей приходится проделыватьдвойную работу, забивая данные в 1С и в эту программу.
    Для их удобства сперва написал небольшой модуль по выгрузке данных в 1С, но они изъявили желание все же перевести всю работу на 1С.
    Вот и пишу, разбираюсь в ней...

    С объектом ЗАПРОС немного уже разобрался.

    Сейчас пытаюсь разобраться как связать контрангентов и счета, счета и акты.

    для вывода списка контрагентов и счетов написал такое:
    Код (Text):
    ЗапросСч = СоздатьОбъект("Запрос");
    ВремТЗ = СоздатьОбъект("ТаблицаЗначений");
    ТекстСч =
    "
    |Период с ДатаНачала по ДатаКонца;
    |ОбрабатыватьДокументы Все;
    |Обрабатывать НеПомеченныеНаУдаление;
    |Счет = Документ.Счет.ТекущийДокумент;
    |Конт = Документ.Счет.Контрагент;
    |Группировка Конт Без Групп;
    |Группировка Счет;";
    // Ищем коды групп для отображения принадлежащих им конрагентов
    СпрК.НайтиПоНаименованию("Физические лица");
    Физик = СпрК.ТекущийЭлемент();
    СпрК.НайтиПоНаименованию("Юридические лица покупатели");
    Юрик = СпрК.ТекущийЭлемент();
    // Составляем запрос
    ТекстЗапроса =
    "
    |Период с ДатаНачала по ДатаКонца;
    |Обрабатывать НеПомеченныеНаУдаление;
    |Конт = Справочник.Контрагенты.ТекущийЭлемент;
    |Группировка Конт Без Групп;";
    Если (Физики = 1) И (Юрики = 1) Тогда  // выбрано отображение и физиков и юриков
    ТекстЗапроса = ТекстЗапроса + "
    |Условие ((Конт.ПринадлежитГруппе(Физик)=1) ИЛИ (Конт.ПринадлежитГруппе(Юрик)=1));";
    ТекстСч = ТекстСч + "
    |Условие ((Конт.ПринадлежитГруппе(Физик)=1) ИЛИ (Конт.ПринадлежитГруппе(Юрик)=1));";
    ИначеЕсли (Физики = 1) Тогда            // отображаем только физиков
    ТекстЗапроса = ТекстЗапроса + "
    |Условие (Конт.ПринадлежитГруппе(Физик) = 1);";
    ТекстСч = ТекстСч + "
    |Условие (Конт.ПринадлежитГруппе(Физик) = 1);";
    ИначеЕсли (Юрики = 1) Тогда              // отображаем только юриков
    ТекстЗапроса = ТекстЗапроса + "
    |Условие (Конт.ПринадлежитГруппе(Юрик)=1);";
    ТекстСч = ТекстСч + "
    |Условие (Конт.ПринадлежитГруппе(Юрик)=1);";
    КонецЕсли;
    Если (Форма.Фильтрация.Видимость() = 1) И (СокрЛП(стрПоиск) <> "") Тогда
    // Обрабатываем данные по фильтру
    ТекстЗапроса = ТекстЗапроса + "
    |Условие (Найти(ВРег(СокрЛП(Конт)),ВРег(СокрЛП(стрПоиск))) > 0);";
    ТекстСч = ТекстСч + "
    |Условие (Найти(ВРег(СокрЛП(Конт)),ВРег(СокрЛП(стрПоиск))) > 0);";
    КонецЕсли;
    // Выполняем запрос
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
    Возврат;
    КонецЕсли;
    Если ЗапросСч.Выполнить(ТекстСч) = 0 Тогда
    Возврат;
    КонецЕсли;
    ЗапросСч.ЗначениеУпорядочивания(1,);
    ЗапросСч.Выгрузить(ВремТЗ,0,0);
    // Формируем список контрагентов
    ВремТЗ.ВыбратьСтроки();
    СтрПолучена = ВремТЗ.ПолучитьСтроку();
    стрВетка = ЗначениеВСтрокуВнутр(ТЗ);
    Пока Запрос.Группировка(1) = 1 Цикл
    // добавляем коентрагента
    ТЗ.НоваяСтрока();
    ТЗ.Пиктограмма = 0;
    ТЗ.СледУровень = ЗначениеИзСтрокиВнутр(стрВетка);
    ТЗ.Код = Запрос.Конт.Наименование;
    ТЗ.Наименование = Запрос.Конт.ПолнНаименование;
    ТЗ.Сумма = "";
    Пока (СокрЛП(Строка(ВремТЗ.Конт)) = СокрЛП(ТЗ.Код)) И (СтрПолучена = 1) Цикл
    //Забиваем "дочек"
    ТЗ.СледУровень.НоваяСтрока();
    ТЗ.СледУровень.СледУровень = ЗначениеИзСтрокиВнутр(стрВетка);
    ТЗ.СледУровень.Пиктограмма = 0;
    ТЗ.СледУровень.Код = ВремТЗ.Счет;
    ТЗ.СледУровень.Наименование = Гы;
    ТЗ.СледУровень.Сумма = СокрЛП(Формат(ВремТЗ.Счет.Итог("Всего"),"Ч20.2, "));
    ТЗ.СледУровень.Раскраска = ДолгНет;
    СтрПолучена = ВремТЗ.ПолучитьСтроку();
    КонецЦикла;
    КонецЦикла;
    Как видно из когда у меня выполняется 2 запроса. А можно лили как-то это все выполнить в одном?

    Со связкой счетов и актов еще ничего не получилось....

    ниже прикрепил как у меня выглядит результат выполнения кода:
     

    Вложения:

    • 1.jpg
      1.jpg
      Размер файла:
      78,1 КБ
      Просмотров:
      22
  6. KiR

    KiR НЕ шибка опытный програмер)
    1C Team

    Регистрация:
    11 сен 2007
    Сообщения:
    1.581
    Симпатии:
    0
    При беглом просмотре не понял если чесно что ты вибираешь. Если вначале ты выбираешь счета - так можно сделать по другому - почитай в синтакс-помощнике про объект Документ
    ВыбратьДокументы(<?>,)
    Синтаксис:
    ВыбратьДокументы(<Дата1>,<Дата2>)

    А если тебе нужно выбрать несколько видов документов с одинаковой аналитикой - это можно сделать в одном запросе
     
  7. puh14

    puh14 Well-Known Member
    1C Team

    Регистрация:
    11 июл 2008
    Сообщения:
    1.412
    Симпатии:
    0
    Гм - насколько вижу проблема в том что при первом запросе выводит только контрагентов по которым были счета - а остальных нет. Если так то в тесктсч

    |Период с ДатаНачала по ДатаКонца;
    |ОбрабатыватьДокументы Все;
    |Обрабатывать НеПомеченныеНаУдаление;
    |Счет = Документ.Счет.ТекущийДокумент, Справочник.Контрагенты.ТекущийЭлемент;
    |Конт = Документ.Счет.Контрагент;
    |Группировка Конт Без Групп Все ;// хотя может все и не надо... путаюсь всё время
    |Группировка Счет;";

    тогда текстЗапроса не нужен.
     
  8. CkoPnuK

    CkoPnuK Гость

    puh14, твой запрос выдае ошибку:
    Но попробую это при формировании связки Счета с Актом

    KiR, первыйзапрос выбирает Счета, которые входят в период с ДатаНачала по ДатаКонца. Второй запрос выводит мне список контрагентов (в зависимости от условия либо физиков, либо юриков, либо и тех, и других). После выполнения запросов, выгрузаю результат первого запроса во временную таблицу значений. Затем выполняю заполнение дерева.
     
  9. KiR

    KiR НЕ шибка опытный програмер)
    1C Team

    Регистрация:
    11 сен 2007
    Сообщения:
    1.581
    Симпатии:
    0
    Тогда получается первый запрос тебе вообще не нужен.
    ВыбратьДокументы(<?>,)
    Синтаксис:
    ВыбратьДокументы(<Дата1>,<Дата2>)
     
  10. puh14

    puh14 Well-Known Member
    1C Team

    Регистрация:
    11 июл 2008
    Сообщения:
    1.412
    Симпатии:
    0
    Пардон - устамши был - конечно

    |Период с ДатаНачала по ДатаКонца;
    |ОбрабатыватьДокументы Все;
    |Обрабатывать НеПомеченныеНаУдаление;
    |Счет = Документ.Счет.ТекущийДокумент;
    |Конт = Документ.Счет.Контрагент, Справочник.Контрагенты.ТекущийЭлемент;//Мож он у тебя клиенты называется - проверь
    |Группировка Конт Без Групп Все;
    |Группировка Счет;";

    а насчет физиков или юриков - просто подставь эти условия в этот запрос.
    а насчет актов - там хоть какая-то ссылка в реквизитах есть на счет? хоть в виде строчки? мож нумерация одинаковая?
     
  11. CkoPnuK

    CkoPnuK Гость

    На счет актов:
    Акт создается на основании Счета, в результате чего у них совпадают:
    - Контрагент
    - Договор
    - Табличная часть

    Запрос сейчас опробус, спасибо)

    KiR, не обижайся, но то, что ты предлогаешь, мне не совсем подхдит. Этим способом я сперва написал, потом попробовал сделать запросом - результат получил в 1,5-2 раза быстрее.

    puh14, запрос отработал на УРА! Сябки! Сейчас с актами буду разбираться)
    ЗЫ: пока плюсики ставить не могу, а так бы уже постаивил
     
  12. puh14

    puh14 Well-Known Member
    1C Team

    Регистрация:
    11 июл 2008
    Сообщения:
    1.412
    Симпатии:
    0
    жаль если он в реквизит не пишется. как в запросе сослаться на подчиненный документ я не в курсах. Самый простой выход использовать ВыбратьПодчиненныеДокументы(), когда заполняешь уровень таблицы сделать что-то вроде
    Где нить вначале

    ДокОснАкт =СоздатьОбъект("Документ");

    Когда перебираешь

    ТЗ.СледУровень.Код = ВремТЗ.Счет;

    ДокОснАкт.ВыбратьПодчиненныеДокументы(,,ВремТЗ.Счет);
    Пока ДокОснАкт.ПолучитьДокумент() = 1 Цикл
    Если ДокОснАкт.Вид() = "Акт" Тогда
    // тут собственно куда его пихать - если актов несколько - выберет всех.
    КонецЕсли;
    КонецЦикла;

    покопался - действительно низя в запросе выбрать подчиненные документы или документ. Если пользуешь 1с++ то можно вытащить прямым запросом. Подробнее про структуру см http://metaprog.co.ua/secrprog/doc_reg.html
     
  13. CkoPnuK

    CkoPnuK Гость

    ясно спасибо большое за помощь!!!
     
  14. CkoPnuK

    CkoPnuK Гость

    Реализовал связку Счетов с Актами, только использовал при этом:
    Код (Text):
    ДокАкт =СоздатьОбъект("Документ");
    ...
    ДокАкт.ВыбратьПоЗначению(ДатаНачала,ТекущаяДата(),"Договор",Запрос.Договор);
    Пока ДокАкт.ПолучитьДокумент() = 1 Цикл
    Если ДокАкт.Вид() = "ОказаниеУслуг" Тогда
    ТЗ.СледУровень.НоваяСтрока();
    ТЗ.СледУровень.СледУровень = ЗначениеИзСтрокиВнутр(стрВетка);
    ТЗ.СледУровень.Пиктограмма = 0;
    ТЗ.СледУровень.Счет = ДокАкт.ТекущийДокумент();
    ТЗ.СледУровень.Объект = ДокАкт.Договор;
    ТЗ.СледУровень.Сумма = "";
    КонецЕсли;
    КонецЦикла;
    Соответственно в запрос была добавлена строка:
    Код (Text):
    |Договор = Документ.Счет.Договор;
    Выбрать по ВыбратьПодчиненныеДокументы у меня не получилось, т.к. акт оказания услуг хотя и создается на основании счета, но подчинения нет ;)
    Еще раз спасибо вам за помошь!
     
Загрузка...

Поделиться этой страницей