Имя: Пароль:
1C
1С v8
Присвоение значений в таблице значений
0 Креатив
 
05.03.14
10:41
Есть таблица значений, полученная в процессе выгрузки результата запроса. Добавляю строчку. Пытаюсь присвоить значения. Некоторые поля принимают значения, а некоторые остаются неопределёнными. Я подозреваю, что какая-то ерунда с типами. Как это лечить?
1 Ненавижу 1С
 
гуру
05.03.14
10:42
(0) присваивать нормальные типы
2 Креатив
 
05.03.14
10:44
(1)А если по-русски?
3 Мимохожий Однако
 
05.03.14
10:45
Можно заранее определить типы для ТЗ, в которую выгружаешь результат запроса
4 Креатив
 
05.03.14
10:47
(2)А если мне в колонке нужны значения различных типов? Значения субконто, например?
5 Мимохожий Однако
 
05.03.14
10:49
(4)Значит надо определить тип в виде массива типов.

ОписаниеТипов (TypeDescription)
Свойства:

КвалификаторыДаты (DateQualifiers)
КвалификаторыДвоичныхДанных (BinaryDataQualifiers)
КвалификаторыСтроки (StringQualifiers)
КвалификаторыЧисла (NumberQualifiers)

Методы:

ПривестиЗначение (AdjustValue)
СодержитТип (ContainsType)
Типы (Types)

Конструкторы:

На основании объекта ОписаниеТипов
На основании типов и квалификаторов

Описание:

Представляет собой объект для управления допустимыми типами значений. В основном предназначен для присвоения в качестве значений соответствующим свойствам других объектов. Набор допустимых типов и квалификаторы примитивных типов задаются при создании объекта.

Доступность:

Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение.
Сериализуется. Данный объект может быть сериализован в/из XML. Может использоваться в реквизитах управляемой формы. Данный объект может быть сериализован в/из XDTO. Тип XDTO, соответствующий данному объекту, определяется в пространстве имен {http://v8.1c.ru/8.1/data/core}. Имя типа XDTO: TypeDescription
Пример:

// Создание описателя типов для таблицы значений
КЧ = Новый КвалификаторыЧисла(12,2);
КС = Новый КвалификаторыСтроки(20);
Массив = Новый Массив;
Массив.Добавить(Тип("Строка"));
ОписаниеТиповС = Новый ОписаниеТипов(Массив, , КС);
Массив.Очистить();
Массив.Добавить(Тип("Число"));
ОписаниеТиповЧ = Новый ОписаниеТипов(Массив, , ,КЧ);

// Создание таблицы значений
ТаблицаЗначений = Новый ТаблицаЗначений;
// добавим в таблицу значений три колонки
ТаблицаЗначений.Колонки.Добавить("Отдел",ОписаниеТиповС,"Отдел",20);
ТаблицаЗначений.Колонки.Добавить("Сотрудник",ОписаниеТиповС,
        "Фамилия сотрудника",20);
ТаблицаЗначений.Колонки.Добавить("Оклад",ОписаниеТиповЧ,"Оклад",10);
6 Креатив
 
05.03.14
10:52
(5) Да уж. 1с по своему неудобству превзошла типизированные языки программирования.
7 Wobland
 
05.03.14
10:53
сразу из запроса получить готовое ещё не предлагали?
8 Мимохожий Однако
 
05.03.14
10:54
(6)Да ладно ))
9 Ненавижу 1С
 
гуру
05.03.14
10:54
(6) ты лучше покажи как у тебя не присваиваются значения
10 Креатив
 
05.03.14
11:03
(9)    
поПодр и дляРаспределения - результаты запросов    (ТЗ)
Для Каждого ст Из поПодр Цикл
   др = дляРаспределения.Добавить();
   др.Счет = ПланыСчетов.Хозрасчетный.НайтиПоКоду("20.01");
   др.Сбк1 = ст.нг; //это
   др.сбк2 = ст.Подразделение; // и это
   др.СуммаОборотКт = ст.СуммаР;
КонецЦикла;
11 Wobland
 
05.03.14
11:06
расстреливать надо за такие имена и подходы
12 Godofsin
 
05.03.14
11:06
(11) +1
13 Креатив
 
05.03.14
11:08
(11)И с какой стороны ты предлагаешь зайти?
14 Ненавижу 1С
 
гуру
05.03.14
11:08
теперь, какой тип у "др.Сбк1" и "ст.нг"
имена конечно жгут
15 Godofsin
 
05.03.14
11:09
(13) Уже предложили в (7)
16 Мимохожий Однако
 
05.03.14
11:10
Встань отладчиком на проблемную строку и посмотри: типы значений слева и справа от равенства, а так же значения.
Вместо ПланыСчетов.Хозрасчетный.НайтиПоКоду("20.01"); можно напрямую указать предопределенный счет
17 Креатив
 
05.03.14
11:10
(15)Не вариант. Значения субконто в запросах разные. Получающиеся типы тоже разные.
18 Мимохожий Однако
 
05.03.14
11:11
Отладчик запусти.
19 Мимохожий Однако
 
05.03.14
11:12
Запрос покажи. Не стесняйся.
20 Wobland
 
05.03.14
11:12
(17) можно попробовать включить мозг и понять, что же всё-таки требуется поиметь на финише
21 Креатив
 
05.03.14
11:13
(18) Я из него и не выходил.
др.сбк1 неопределено
ст.нг номенклатурные группы
22 Мимохожий Однако
 
05.03.14
11:16
После прохождения у др.сбк1 тип и значения поменялись?
23 Ненавижу 1С
 
гуру
05.03.14
11:20
(21) тип поля "сбк1" а не текущего значения
24 Креатив
 
05.03.14
11:23
(19) Да хоть весь код. Я уже понял, что придётся предварительно создавать ТЗ. Есть ли возможность назначить колонке тип ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные

Запрос = Новый Запрос;
ТекстЗапроса90 = // НДС к вычету
   "ВЫБРАТЬ
   |    ХозрасчетныйОбороты.Счет,
   |    0 КАК сбк2,
   |    Значение(Перечисление.ВидыПлатежейВГосБюджет.Налог) КАК сбк1,
   |    ХозрасчетныйОбороты.СуммаОборотКт
   |ИЗ
   |    РегистрБухгалтерии.Хозрасчетный.Обороты(&дт1, &дт2, Авто, Счет.Код = ""90.01.1"", , Организация = &орг, , ) КАК ХозрасчетныйОбороты";
Запрос.Текст = ТекстЗапроса90;
Запрос.УстановитьПараметр("орг", Организация);
Запрос.УстановитьПараметр("дт1", НачалоМесяца(Дата));
Запрос.УстановитьПараметр("дт2", КонецМесяца(Дата));
дляРаспределения = Запрос.Выполнить().Выгрузить();
    
ТекстЗапроса90 =  // по ЕНВД
   "ВЫБРАТЬ
   |    ""20.01"" КАК Счет,
   |    ХозрасчетныйОбороты.Субконто1 КАК сбк1,
   |    ХозрасчетныйОбороты.СуммаОборотКт
   |ИЗ
   |    РегистрБухгалтерии.Хозрасчетный.Обороты(&дт1, &дт2, Авто, Счет.Код = ""90.01.2"", , Организация = &орг, , ) КАК ХозрасчетныйОбороты";
Запрос.Текст = ТекстЗапроса90;
Запрос.УстановитьПараметр("орг", Организация);
Запрос.УстановитьПараметр("дт1", НачалоМесяца(Дата));
Запрос.УстановитьПараметр("дт2", КонецМесяца(Дата));
дляПодр = Запрос.Выполнить().Выгрузить();
Для Каждого нг Из ДляПодр Цикл
   ТекстЗапроса20 =  // подразделения по данной номенклатурной группе
      "ВЫБРАТЬ
      |    ХозрасчетныйОбороты.Счет,
      |    ХозрасчетныйОбороты.Субконто1 КАК НГ,
      |    ХозрасчетныйОбороты.Подразделение,
      |    ХозрасчетныйОбороты.СуммаОборотДт КАК оборот20
      |ИЗ
      |    РегистрБухгалтерии.Хозрасчетный.Обороты(&дт1, &дт2, Авто,
      |            Счет.Код = ""20.01"",,
      |            Организация = &орг И Субконто1 = &нг,,
      |            ) КАК ХозрасчетныйОбороты";
   Запрос.Текст = ТекстЗапроса20;
   Запрос.УстановитьПараметр("орг", Организация);
   Запрос.УстановитьПараметр("нг", нг.сбк1);
   поПодр = Запрос.Выполнить().Выгрузить();
    МоиДоработки.РаспределитьСправедливо(поПодр, нг.СуммаОборотКт, "оборот20");
   Для Каждого ст Из поПодр Цикл
      др = дляРаспределения.Добавить();
      др.Счет = ПланыСчетов.Хозрасчетный.НайтиПоКоду("20.01");
      др.Сбк1 = ст.нг;
      др.сбк2 = ст.Подразделение;
      др.СуммаОборотКт = ст.СуммаР;
   КонецЦикла;
КонецЦикла;
25 Креатив
 
05.03.14
11:30
(23)Если 1С берёт из запроса, то Перечисление.ВидыПлатежейВГосБюджет.Налог
26 Мимохожий Однако
 
05.03.14
11:38
Если тип значения для субконто не крититчно, то в запросе используй функцию Представление() и тогда у тебя все значения будут строковые.
27 Ненавижу 1С
 
гуру
05.03.14
11:40
(25) а суешь ты туда номенклатурные группы?
28 Креатив
 
05.03.14
11:51
(26)Критично.
(27)ну да.
29 The_SpecialOne
 
05.03.14
11:51
предлагаю покрутить МассивВидовСубконто

МоиДоработки.РаспределитьСправедливо( - это прекрасно
30 Креатив
 
05.03.14
12:02
Ппробовал вначале создать таблицу значений. Не помогает.
    дляРаспределения = Новый ТаблицаЗначений;
    дляРаспределения.Колонки.Добавить("Счет");
    дляРаспределения.Колонки.Добавить("сбк1");
    дляРаспределения.Колонки.Добавить("сбк2");
    дляРаспределения.Колонки.Добавить("СуммаОборотКт");
31 Креатив
 
05.03.14
12:22
Помогла только ручная выгрузка результата запроса в ТЗ. Это провал с точки зрения программирования.
32 Ненавижу 1С
 
гуру
05.03.14
12:23
(31) у тебя провал?
33 Креатив
 
05.03.14
12:25
(32)У 1С.)
34 Godofsin
 
05.03.14
12:26
(33)неа
35 1Сергей
 
05.03.14
12:30
(31) объясни чем ручная выгрузка результата запроса (пост (31)) отличается от неручной выгрузки результата запроса (пост (0))
36 Креатив
 
05.03.14
12:30
(35)Скоростью?
37 Креатив
 
05.03.14
12:31
(36)+ размером кода?
38 Wobland
 
05.03.14
12:32
(35) Вопрос("Вы действительно хотите произвести выгрузку результата запроса?"), не?
39 1Сергей
 
05.03.14
12:36
(38) а... и помогло именно это?
40 Wobland
 
05.03.14
12:41
у меня был какой-то костыль с предупреждением в одну секунду. принтер не успевал среагировать на пачку ;)