Имя: Пароль:
1C
1C 7.7
v7: Получить вид документа через неопределенный документ?
0 Balabass
 
30.10.13
08:37
Док = СоздатьОбъект("Документ");
СписокДок = СоздатьОбъект("СписокЗначений");
СписокДок.ДобавитьЗначение( КАК УКАЗАТЬ ОПРЕДЕЛЕННЫЙ ДОКУМЕНТ ЧЕРЕЗ ПЕРЕМННУЮ ДОК ?.Вид());
1 Mikeware
 
30.10.13
09:12
чиво?
2 бомболюк
 
30.10.13
09:18
да, что то телепатируется с трудом...
3 Wobland
 
30.10.13
09:19
попробую стелепатировать: Док.Вид()
4 1dvd
 
30.10.13
09:20
Док = СоздатьОбъект("Документ");
Док.НайтиДокумент(...);
Док.НайтиПоНомеру(...);
Док.НайтиПоРеквизиту(...);
СписокДок = СоздатьОбъект("СписокЗначений");
СписокДок.ДобавитьЗначение(Док.ТекущийДокумент());
5 Rie
 
30.10.13
09:20
(0) Сильно непонятно, что надо.
(Что Док - не спозиционирован - это видно).
6 Voronve
 
30.10.13
09:22
(0)
спДокументы = СоздтьОбъект("СписокЗначений");
Для I = 1 по Метаданные.Документ() Цикл
спДокументы.ДобавитьЗначение(Метаданные.Документ(I).Идентификатор);
КонецЦикла;
7 Rie
 
30.10.13
09:24
А давайте для разнообразия узнаем, что же ТС нужно...
8 пипец
 
30.10.13
09:24
Док=создатьобъект("Документ")
СписокДок.ДобавитьЗначение(Док."+"Мойвиддокумента")
9 1dvd
 
30.10.13
09:25
(7) это не спортивно. Надо угадать до того, как ТС протрезвеет
10 Balabass
 
30.10.13
09:40
Я хочу забить список значений видами документов нужных мне.
Хочу обратится к ним через переменную Док.
11 Balabass
 
30.10.13
09:41
Есть неопределнный документ - ДОК
и есть документ в конфигураторе Табель
Как мне получить Вид() документа Табель без СозданиеОбъекта ДОкумент.Табель?
12 1dvd
 
30.10.13
09:41
(10) А какая религия запрещает обращаться к Метаданные() и заставляет обращаться именно к Док?
13 Rie
 
30.10.13
09:43
(11) "Табель" - это и есть вид документа Табель.
Тебе _все_ виды документов в список запихнуть надо? Тогда (6).
Или виды каких-то конкретных документов? Тогда спроси у этих документов Вид(). Причём Док = СоздатьОбъект("Документ") в этом случае тебе и даром не нужен.
14 Guk
 
30.10.13
09:48
мне одному показалось, что автор не понимает о чем он говорит?...
15 1dvd
 
30.10.13
09:53
Один кривой программист за год работы создает два новых рабочих места
16 Эльниньо
 
30.10.13
09:59
(15) )))
Пирамида, однако.
17 Mikeware
 
30.10.13
10:01
(11) строка с содержимым "Табель" - и есть то, что возарощает метод Вид() объекта вида Документ.Табель()
18 пипец
 
30.10.13
10:01
геометрическая прогрессия - выражовывайтеся научнее ;))
19 Balabass
 
30.10.13
11:40
Минуту...что то вас понесло.
Есть 5 документов - вид() которых нужно занести в список значений.
Но обратится у ним нужно через док=создатьОбъект("Документы");
Я знаю название документов в пофигураторе, но не знаю их синонимов.
Мне это нужно для следующего условия
Если СписокЗначений.Включает(ТекущийДОкИзЦикла.Вид())=1 тогда
Все ОК.
КонецЕсли.
20 Mikeware
 
30.10.13
11:43
(19) см. (17).
"название к конфигураторе" - это как раз Вид()
21 Mikeware
 
30.10.13
11:44
Тебе нужно синонимы в список, а сравнивать с видом?
22 пипец
 
30.10.13
11:45
(19) возьми из типовой бухгалтерии 77 обработку - называется - "обработкаДокументов" и кури ее
23 Balabass
 
30.10.13
11:46
(20) Документы.Табель.Вид() ??? Не работает такая конструкция.
24 пипец
 
30.10.13
11:50
(23) читай (22) и посмотри как там реализовано
ЗЫ вид() применяется в твоем случае к объекту ДОКУМЕНТ
25 ЧеловекДуши
 
30.10.13
11:51
(0) Сперва получаешь ссылку или объект самого документа через "Выбрать(), Найти()" и потом общаешься через (ВИД) :)
26 ЧеловекДуши
 
30.10.13
11:52
(10) 1С, в типовом варианте, на своих кривых, Черных запросах, - этого не умеет :)
27 Mikeware
 
30.10.13
11:52
(23) обкурился?
28 ЧеловекДуши
 
30.10.13
11:52
(14) Да нет, не только :)
29 Balabass
 
30.10.13
11:53
(24) Я знаю что вид() применяется к документ. Но документ у меня неопределен. Я знаю что конфигураторе есть  документ с именем табель.
Я создал необпределенный документ ДОК.
Вот если бы я создал ДОк = СоздатьОбъект("Док.Табель") - тогда вообще без вопросов.
А мне надо через Док, чтобы было типо
Док["Табель"] или подобная конструкция.
Мне не определенный документ нужен, мне нужно выдернуть из документа док.табель.вид()
30 ЧеловекДуши
 
30.10.13
11:53
(23) Ты, мальчик, чего хотел в (0)?
В конечном счете получить?
Кинуть бессмысленный список, куда-то и без напряга выбрать только нужные виды документов по запросу ли выборке? :)
31 Balabass
 
30.10.13
11:54
(30) Да.
32 Mikeware
 
30.10.13
11:55
(29)
СоздатьОбъект("Докуиент."+ТутНазваниеТогоВидаКоторогоТебеНадо)
33 ЧеловекДуши
 
30.10.13
11:56
(29) Прямой запрос, только Прямой запрос...
Ты там можешь указать ряд условий отбора документов и не страдать... По типо этого...

////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Проведен: 1 - отберать по проведенным,
//            0 - не учитывать (если ""БезУдаленых = 0"", то отбераются все документы)
//БезУдаленых:  1 - отбераются не помеченные на удаления,
//                2 - отбираются только помеченные на удаления, 0 - не учитывать
//Параметры "Проведен" и "БезУдаленых", при не нулевом значении, отрабатывают совместно по принципу "ИЛИ".
//
//Порядок: 0 - Сортровать по возрастанию, 1 - Сортировать по Убыванию.
//
//ВремяДатаТайм: 0 - Отбирать документ, как Дату и время (ИД документа не учитывается)... 1 - Учитывается еще и ИД документа
Функция глВыбратьПодчиненныеДокументы(ДатаНач,ДатаКон,Док,ТипДок="",Проведен=0,БезУдаленых=0,Порядок=0,ВремяДатаТайм=1) Экспорт
    Перем Рез;
    Перем ТЗЗапрос, СкульЗапрос;
    Перем СтрокаДляЗапроса, НомСимв, КолСимв, СтрокПоиск,СтрокПолуч;
    Перем МетаНомер, ЧтоЭто;
    
    //Для локального применения
    //глRecord1С = СоздатьОбъект("ODBCRecordSet");
    //глMeta1С = СоздатьОбъект("MetaDataWork");
    
    Если ТипЗначенияСтр(глRecord1С) <> "ODBCRecordSet" Тогда
        глRecord1С = 0;
        глRecord1С = СоздатьОбъект("ODBCRecordSet");
    КонецЕсли;
    
    Если ТипЗначенияСтр(глMeta1С) <> "MetaDataWork" Тогда
        глMeta1С = 0;
        глMeta1С = СоздатьОбъект("MetaDataWork");
    КонецЕсли;
    
    Рез = 0; //Ошибка в запросе!
    Если ТипЗначения(Док) <> 12 Тогда //12 - агрегатный тип данных 'Документ';
        Возврат Рез;
    ИначеЕсли ПустоеЗначение(Док) = 1 Тогда
        Рез = СоздатьОбъект("ТаблицаЗначений");
        Рез.НоваяКолонка("Док","Документ");
        Возврат Рез;
    КонецЕсли;
    
    Если глОтладкаSQL = 1 Тогда
        глRecord1С.Отладка(1);
    КонецЕсли;
    
    СкульЗапрос="
    |SET NOCOUNT ON
    //|set LANGUAGE russian
    |
    |SELECT
    | dbo.sp_tohex(TabJ.IDDOCDEF,4)+TabJ.IDDOC [Док $Документ]
    |FROM
    | _1SCRDOC As TabRod(NOLOCK)
    |INNER JOIN
    | _1SJOURN As TabJ(NOLOCK) ON (TabRod.CHILDID = TabJ.IDDOC)
    |WHERE
    | TabRod.MDID = 0 -- только документы, без граф отбора
    | AND TabRod.PARENTVAL = '"+глMeta1С.ЗначениеВСамуюДлиннуюСтрокуБД(Док.ТекущийДокумент())+"'
    |";
    Если ПустоеЗначение(ДатаНач)=0 Тогда
        МетаНомер = "";
        Если ТипЗначения(ДатаНач) = 12 Тогда //Документ
            Если ВремяДатаТайм = 0 Тогда
                МетаНомер = ""+глMeta1С.ПолучитьДатуВремяИдДок(ДатаНач.ПолучитьПозицию());
            Иначе
                МетаНомер = ""+глMeta1С.ПолучитьДатуВремяИдДок(ДатаНач.ПолучитьПозицию())+глMeta1С.ЗначениеВСтрокуБД(ДатаНач.ТекущийДокумент());
            КонецЕсли;
        ИначеЕсли ТипЗначения(ДатаНач) = 3 Тогда //3 - тип данных Дата;
            МетаНомер = ""+глMeta1С.ПолучитьСтрИзДаты(ДатаНач);
        ИначеЕсли ПустоеЗначение(Дата(ДатаНач)) = 0 Тогда
            МетаНомер = ""+глMeta1С.ПолучитьСтрИзДаты(Дата(ДатаНач));
        КонецЕсли;
        Если ПустоеЗначение(МетаНомер) = 0 Тогда
               СкульЗапрос=СкульЗапрос+"
               |and TabJ.DATE_TIME_IDDOC>='"+МетаНомер+"'
            |";
        КонецЕсли;
    КонецЕсли;
    Если ПустоеЗначение(ДатаКон)=0 Тогда
        МетаНомер = "";
        Если ТипЗначения(ДатаКон) = 12 Тогда //Документ
            Если ВремяДатаТайм = 0 Тогда
                МетаНомер = ""+глMeta1С.ПолучитьДатуВремяИдДок(ДатаКон.ПолучитьПозицию())+"Z";
            Иначе
                МетаНомер = ""+глMeta1С.ПолучитьДатуВремяИдДок(ДатаКон.ПолучитьПозицию())+глMeta1С.ЗначениеВСтрокуБД(ДатаКон.ТекущийДокумент());
            КонецЕсли;
        ИначеЕсли ТипЗначения(ДатаНач) = 3 Тогда //3 - тип данных Дата;
            МетаНомер = ""+глMeta1С.ПолучитьСтрИзДаты(ДатаКон)+"Z";
        ИначеЕсли ПустоеЗначение(Дата(ДатаНач)) = 0 Тогда
            МетаНомер = ""+глMeta1С.ПолучитьСтрИзДаты(Дата(ДатаНач))+"Z";
        КонецЕсли;
        Если ПустоеЗначение(МетаНомер) = 0 Тогда
               СкульЗапрос=СкульЗапрос+"
               |and TabJ.DATE_TIME_IDDOC<='"+МетаНомер+"'
            |";
        КонецЕсли;
    КонецЕсли;
    Если ПустоеЗначение(СокрЛП(ТипДок)) = 0 Тогда
        СтрокПоиск = СокрЛП(ТипДок);
        КолСимв       = СтрЧислоВхождений(СтрокПоиск,",");
        Если КолСимв <> 0 Тогда
            КолСимв = КолСимв + 1;
            СтрокаДляЗапроса = "";
            Пока КолСимв <> 0 Цикл
                
                Если КолСимв = 1 Тогда //Он один
                    СтрокПолуч = СокрЛП(СтрокПоиск);
                Иначе
                    НомСимв       = Найти(СтрокПоиск,",");
                    Если НомСимв = 0 Тогда
                        Сообщить("Ошибка в разборе команды: "+ТипДок);
                    КонецЕсли;
                    СтрокПолуч = СокрЛП(Сред(СтрокПоиск,1,НомСимв-1));
                    СтрокПоиск = СокрЛП(Сред(СтрокПоиск,НомСимв+1));
                КонецЕсли;
                
                Если ПустоеЗначение(СтрокПолуч) = 0 Тогда
                    ЧтоЭто = ЭтоЧисло(СтрокПолуч);
                    Если СуществуетТакойВидДок(ЧтоЭто) = 1 Тогда
                        МетаНомер = глMeta1С.ИДДокумента(ЧтоЭто);
                        СтрокаДляЗапроса = СтрокаДляЗапроса + ?(ПустоеЗначение(СтрокаДляЗапроса)=1,"",",") + "'"+МетаНомер+"'";
                    КонецЕсли;
                КонецЕсли;
                
                КолСимв = КолСимв - 1;
            КонецЦикла;
            Если ПустоеЗначение(СтрокаДляЗапроса) = 0 Тогда
                СкульЗапрос=СкульЗапрос+"
                |and TabJ.IDDOCDEF in ("+СтрокаДляЗапроса+")
                |";  // '"+глMeta1С.ИДДокумента(ТипДок)+"'
            КонецЕсли;
        Иначе
            МетаНомер  = "";
            СтрокПолуч = СокрЛП(ТипДок);
            
            Если ПустоеЗначение(СтрокПолуч) = 0 Тогда
                ЧтоЭто = ЭтоЧисло(СтрокПолуч);
                Если СуществуетТакойВидДок(ЧтоЭто) = 1 Тогда
                    МетаНомер = глMeta1С.ИДДокумента(ЧтоЭто);
                    СтрокаДляЗапроса = СтрокаДляЗапроса + ?(ПустоеЗначение(СтрокаДляЗапроса)=1,"",",") + "'"+МетаНомер+"'";
                КонецЕсли;
            КонецЕсли;
            
            Если ПустоеЗначение(МетаНомер) = 0 Тогда
                СкульЗапрос=СкульЗапрос+"
                |and TabJ.IDDOCDEF='"+МетаНомер+"'
                |";
            КонецЕсли;
        КонецЕсли;
    КонецЕсли;
    Если Проведен = 1 Тогда
        Если БезУдаленых = 1 Тогда
            СкульЗапрос=СкульЗапрос+"
            |and (((TabJ.CLOSED & 1) = 1) or (TabJ.IsMark = 0))
            |";
        ИначеЕсли БезУдаленых = 2 Тогда
            СкульЗапрос=СкульЗапрос+"
            |and (((TabJ.CLOSED & 1) = 1) or (TabJ.IsMark <> 0))
            |";
        Иначе
            СкульЗапрос=СкульЗапрос+"
            |and ((TabJ.CLOSED & 1) = 1)
            |";
        КонецЕсли;
    Иначе
        Если БезУдаленых = 1 Тогда
            СкульЗапрос=СкульЗапрос+"
            |and (TabJ.IsMark = 0)
            |";
        ИначеЕсли БезУдаленых = 2 Тогда
            СкульЗапрос=СкульЗапрос+"
            |and (TabJ.IsMark <> 0)
            |";
        КонецЕсли;
    КонецЕсли;
    СкульЗапрос=СкульЗапрос+"
    |ORDER BY
    |TabRod.CHILD_DATE_TIME_IDDOC "+?(Порядок=0,"ASC","DESC")+"
    |";
    
    Если глRecord1С.Подготовить(СкульЗапрос)=0 Тогда
        Сообщить("Запрос не прошел "+глRecord1С.ПолучитьОписаниеОшибки()+"
        |"+СкульЗапрос,"!");
        Возврат Рез;
    КонецЕсли;
    
    ТЗЗапрос = 0;
    ТЗЗапрос = СоздатьОбъект("ТаблицаЗначений");
    Попытка
        ЗначСпс = глRecord1С.ВыполнитьИнструкцию(,ТЗЗапрос,1);
    Исключение
        Сообщить("ВыполнитьИнструкцию: "+ОписаниеОшибки());
    КонецПопытки;
    
    Попытка
        глRecord1С.Закрыть();
    Исключение
        Сообщить("Закрыть SQL запрос: "+ОписаниеОшибки());
    КонецПопытки;
    
    Если ТипЗначенияСтр(ТЗЗапрос) <> "ТаблицаЗначений" Тогда
        Сообщить("Нет нужного параметра!","!");
    ИначеЕсли ТЗЗапрос.КоличествоКолонок() = 0 Тогда
        ТЗЗапрос.НоваяКолонка("Док","Документ");
        Сообщить("Запрос не выполнен:
        |"+СкульЗапрос,"!");
    Иначе
        Рез = ТЗЗапрос;
    КонецЕсли;
    
    Возврат Рез;
КонецФункции
34 Balabass
 
30.10.13
11:56
(32) Это понятно...
Но если нужно перебрать 10 документов?
каждый раз
док = создатьОбъект("документ.НужныйМнедокумент").вид()
списокзначений.добавитьсзначение(док)
?
35 ЧеловекДуши
 
30.10.13
11:56
(31) Нет такого счастья :)
Приходится извращаться, тупым перебором, либо в цикле, либо по запросу писать свою функцию :)
36 ЧеловекДуши
 
30.10.13
11:57
(34) 10 циклов для метода в (32)
37 Balabass
 
30.10.13
11:58
Это же не совсем удобно. разве нет?
38 Mikeware
 
30.10.13
11:59
(34) зачем?
39 Balabass
 
30.10.13
12:01
(38) Ну а как? Тупой перебор.
40 ЧеловекДуши
 
30.10.13
12:04
(37) А кто сказал, что в 1С все удобно :)
41 Mikeware
 
30.10.13
12:05
(39) ты можешь русским языком сказать - что тебе нужно сделать?
42 ЧеловекДуши
 
30.10.13
12:06
(39) Ага... либо пишешь запрос

Функция ЯтутГлавный(АвансовыйОтчет)
    
    Если АвансовыйОтчет.Вид() = "Оно.Радимое.Моё" Тогда
        Возврат 1;
    КонецЕсли;
    
    Возврат 0;
КонецФункции    // ЯтутГлавный(АвансовыйОтчет)

//*******************************************
// Процедура генерации запроса Сформировать.
//
Процедура Сформировать()
    Перем Запрос, ТекстЗапроса, Таб;
    //Создание объекта типа Запрос
    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса =
    "//{{ЗАПРОС(Сформировать)
    |Период с ВыбНачПериода по ВыбКонПериода;
    |АвансовыйОтчет = Документ.АвансовыйОтчет.ТекущийДокумент;
    |Условие(ЯтутГлавный(АвансовыйОтчет)=1);
    |"//}}ЗАПРОС
    ;
    // Если ошибка в запросе, то выход из процедуры
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
        Возврат;
    КонецЕсли;

    // Подготовка к заполнению выходных форм данными запроса
    Таб = СоздатьОбъект("Таблица");
    Таб.ИсходнаяТаблица("Сформировать");
    // Заполнение полей "Заголовок"
    Таб.ВывестиСекцию("Заголовок");
    Состояние("Заполнение выходной таблицы...");
    Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0);
    // Вывод заполненной формы
    Таб.ТолькоПросмотр(1);
    Таб.Показать("Сформировать", "");
КонецПроцедуры
43 Balabass
 
30.10.13
12:06
СписокЗначений.ДобавитьЗначение(метаданные.Документ("Табель").Идентификатор)
44 ЧеловекДуши
 
30.10.13
12:08
(43) Нет... так тебя тоже не поймут :)
Ибо "Табель", тебе уже известен :)
45 Rie
 
30.10.13
12:09
(43) Офигеть...
СписокЗначений.ДобавитьЗначение("Табель");
_полностью_ эквивалентно этой странной констукции. При условии, что документ "Табель" есть в конфигурации.
Блииииин... Не понимаю!......
46 Balabass
 
30.10.13
12:09
(44) метаданные.Документ("Табель").Идентификатор = СоздатьОбъект("Документы.Табель").Вид()
Типо того.
Мне вот это равенство нужно было соблюсти.
47 Mikeware
 
30.10.13
12:10
(43) То, что ты написал -
СписокЗначений.ДобавитьЗначение("Табель")
48 Balabass
 
30.10.13
12:11
(47) Это не наш метод))))
Ладно...тему офф.
49 Rie
 
30.10.13
12:12
(46) Оно типа того... Само соблюдётся...

Ты лучше расскажи - откуда трава-то взялась.
50 Mikeware
 
30.10.13
12:12
(48) "нас невозможно сбить с пути - нам по.ую, куда идти!"©
51 ЧеловекДуши
 
30.10.13
12:13
(48) Почему?...
Тебе вроде сказали, то, что ты хочешь в (30), НЕТ такого в типовом варианте :)

Но это получают на подобие в (33) или в (42)
52 Balabass
 
30.10.13
12:15
(51) Угу...
53 Mikeware
 
30.10.13
12:16
(51) вы одну траву курите?
54 ЧеловекДуши
 
30.10.13
12:18
(53) Да ему нужно тупо по команде "Выбрать"

    Докум = СоздатьОбъект("Документ");
    Докум.ВыбратьДокументы(Начало,Конец);
    Пока Докум.ПолучитьДокумент() = 1 Цикл
        
    КонецЦикла;

Выбрать только ряд документов, а не все скопом :)
55 ЧеловекДуши
 
30.10.13
12:18
+(53) При этом без прямых запросов и быстро :)
56 Balabass
 
30.10.13
12:19
(54) Это слишком просто)))
57 Balabass
 
30.10.13
12:19
(55) В точку
58 ЧеловекДуши
 
30.10.13
12:19
(57) Нет такого счастья... сам бы хотел, но нет :(
59 Balabass
 
30.10.13
12:20
(58) Счастье всем и каждому...и пусть никто не уйдет обиженным.
60 Mikeware
 
30.10.13
12:22
(55) ну и что мешает?
и проверять-
Если  Найти(Док.Вид()+";", ТутСтрокаНужныхВидовРазеленныхТочкойСЗапятой)
тогда
продолжить
Конецесли

Надеюсь, по списку с галочками сформировать строку ума хватит?
61 ЧеловекДуши
 
30.10.13
12:25
(60) Он это назвал (56)... "мастер" хочет через это, как хочет в (0) :)
62 1dvd
 
30.10.13
12:32
СписокДок = СоздатьОбъект("СписокЗначений");
СписокДок.ДобавитьЗначение("Табель");
СписокДок.ДобавитьЗначение("Шмабель");
СписокДок.ДобавитьЗначение("Куябель");
Док = СоздатьОбъект("Документ");
Док.ВыбратьДокументы(Начало,Конец);
Пока Док.ПолучитьДокумент() = 1 Цикл
    Если СписокДок.НайтиЗначение(Док.Вид())=0 Тогда
        Продолжить;
    КонецЕсли;
КонецЦикла;


так чтоли?
63 ЧеловекДуши
 
30.10.13
12:38
(62) Будем ждать автора, он чего-то пропал... :)
Неужели он пошёл строчить 10-ть циклов через метаданные :)