Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Массивы 1с 7.7
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 7.7
l2d808
Добрый день уважаемое сообщество. У меня платформа 7.7. Пытаюсь понять как в 1с7.7 реализирован принцип построения многомерных массивов. К сожалению не получаетсяю:-)
перем а[ы]


Работает, а вот
перем а[ы,в]

работать отказывается в чистую. подскажите пожалуйста как правильно строить многомерные массивы в 1с7.7
Заранее благодарен.
Vofka
Никогда вроде в 1С не встречал многомерных массивов smile.gif . А почему вас ТЗ не устраивает?
DartRomanius
Если не отшибает мне память то максимум 2-х мерные.
перем а[n][n];
l2d808
Цитата(Vofka @ 05.09.11, 9:11) необходимо зарегистрироваться для просмотра ссылки
Никогда вроде в 1С не встречал многомерных массивов smile.gif . А почему вас ТЗ не устраивает?

Вроде и ТЗ устраивает. Но задача состоит в том например: надо построить массив по контрагентам закупки за период. Периоды могут изменятся, Контрагенты могут изменятся. Тытаюсь написать полуинтелектуальную обработку аналитики по контрагентам, а вот дву, трех- мерных массивов применить не могу, помогите пожалуйста обойти эти ограничения.

Цитата(DartRomanius @ 05.09.11, 9:15) необходимо зарегистрироваться для просмотра ссылки
Если не отшибает мне память то максимум 2-х мерные.
перем а[n][n];


Попорбовал Ваше предложение. В 7.7 не работает. :-(

Цитата(DartRomanius @ 05.09.11, 9:15) необходимо зарегистрироваться для просмотра ссылки
Если не отшибает мне память то максимум 2-х мерные.
перем а[n][n];

Попробовал Ваше предложение. В 7.7 не к сожалению работает.
Vofka
Цитата
Вроде и ТЗ устраивает.

Так используйте ТЗ smile.gif

Цитата
а вот дву, трех- мерных массивов применить не могу

Ещё раз повторюсь - если подходит ТЗ, то можно сказать так: 2-х мерный массив = ТЗ с 2 колонками, 3-мерный массив = ТЗ с 3 колонками. Или же надо использовать какие-то специфичные методы, которые присущи только массивам?
DartRomanius
Цитата(Vofka @ 05.09.11, 9:26) необходимо зарегистрироваться для просмотра ссылки
Ещё раз повторюсь - если подходит ТЗ, то можно сказать так: 2-х мерный массив = ТЗ с 2 колонками, 3-мерный массив = ТЗ с 3 колонками. Или же надо использовать какие-то специфичные методы, которые присущи только массивам?


С каких это делов то? smile.gif
ТЗ в принципе 2-х мерный массив с фиксированной (почти) строкой.
l2d808
Цитата(Vofka @ 05.09.11, 9:26) необходимо зарегистрироваться для просмотра ссылки
Так используйте ТЗ smile.gif


Ещё раз повторюсь - если подходит ТЗ, то можно сказать так: 2-х мерный массив = ТЗ с 2 колонками, 3-мерный массив = ТЗ с 3 колонками. Или же надо использовать какие-то специфичные методы, которые присущи только массивам?

ТЗ.ПерваяКолонка[М];
ТЗ.ВтораяКолонка[L];
ТЗ.ТретьяКолонка[N];

Причем: M,N,L Могут меняться в зависимости от многих ситуаций. их предсказать не возможно.
Приблизительно такое должно быть построение. Это как-то может быть выполнимо?
DartRomanius
ТЗ - в принципе массив с оберткой, повторяюсь 2-х мерный массив за счет колонок.

Можно комбинировать кстати, получится уже не массив, а несколько более сложная структура - например ТЗ или СЗ с значениями типа ТЗ или СЗ.

ЗЫ: ТЗ - ТаблицаЗначений, СЗ - СписокЗначений
oleynik
В 1С 7.7. аналог одномерного массива - список значений, а двумерного - таблица значений. Вроде так... А может Вам подойдут регистры? К ним можно обращаться с запросом.
Vofka
Цитата
А может Вам подойдут регистры? К ним можно обращаться с запросом.

Не, ну это вы уже загнули...
l2d808
Цитата(DartRomanius @ 05.09.11, 9:35) необходимо зарегистрироваться для просмотра ссылки
ТЗ - в принципе массив с оберткой, повторяюсь 2-х мерный массив за счет колонок.

Можно комбинировать кстати, получится уже не массив, а несколько более сложная структура - например ТЗ или СЗ с значениями типа ТЗ или СЗ.

ЗЫ: ТЗ - ТаблицаЗначений, СЗ - СписокЗначений


Простите за вопрос, Но. Можно пример кода? по моим условиям, я не могу понять как СЗ мне поможет в этой ситуации.

Цитата(Vofka @ 05.09.11, 9:42) необходимо зарегистрироваться для просмотра ссылки
Не, ну это вы уже загнули...

Я не очень силен пока в 1с. Подскажите что такое регистры и как они мне могут помочь?
alex1c
Цитата(l2d808 @ 05.09.11, 9:32) необходимо зарегистрироваться для просмотра ссылки
ТЗ.ПерваяКолонка[М];
ТЗ.ВтораяКолонка[L];
ТЗ.ТретьяКолонка[N];

Причем: M,N,L Могут меняться в зависимости от многих ситуаций. их предсказать не возможно.
Приблизительно такое должно быть построение. Это как-то может быть выполнимо?


Используйте ТЗ.ПолучитьЗначение(<Строка>,<Колонка>) и УстановитьЗначение(<Строка>,<Колонка>,<Знач>) и легко можна обойтись без всяких массивов...
Vofka
Цитата
С каких это делов то? smile.gif

Ну примерно с таких, как написал выше alex1c smile.gif

ЗЫ. не увидел сразу этого вопроса.
l2d808
Цитата(alex1c @ 05.09.11, 9:48) необходимо зарегистрироваться для просмотра ссылки
Используйте ТЗ.ПолучитьЗначение(<Строка>,<Колонка>) и УстановитьЗначение(<Строка>,<Колонка>,<Знач>) и легко можна обойтись без всяких массивов...

Проблема в том что колонки нужно регламентировать, а меня интересует ситуация, при которой число колонок будет плавающим.

Цитата(Vofka @ 05.09.11, 9:55) необходимо зарегистрироваться для просмотра ссылки
Ну примерно с таких, как написал выше alex1c smile.gif

ЗЫ. не увидел сразу этого вопроса.

Не подходит его вариант. Мне нужно чтоб число колонок было плавающим. И на каждой строчке свое количество столбцов.
DartRomanius
Цитата(l2d808 @ 05.09.11, 9:58) необходимо зарегистрироваться для просмотра ссылки
Проблема в том что колонки нужно регламентировать, а меня интересует ситуация, при которой число колонок будет плавающим.


Не подходит его вариант. Мне нужно чтоб число колонок было плавающим. И на каждой строчке свое количество столбцов.


Колонки можно добавлять динамически так-сказать, по ходу пьесы...



Цитата(Vofka @ 05.09.11, 9:55) необходимо зарегистрироваться для просмотра ссылки
Ну примерно с таких, как написал выше alex1c smile.gif

ЗЫ. не увидел сразу этого вопроса.


Не, сама ТЗ все-таки 2-х мерный массив, а вот если (как и говорилось выше) использовать сложные значения....
Но ИМХО это уже будет сложная структура не совсем подходящая под определения простого массива.

ЗЫ: в догонку, можно еще использовать что-то типа Перем А[Н1 * ДлинаСтроки + Н2], где н1 = номер строки, а н2 = номер колонки. smile.gif И по.... что где-то низзя использовать н-мерность (в данном случае 2).
Virgo
ТЗ можно вкладывать в ТЗ
l2d808
Цитата(l2d808 @ 05.09.11, 9:02) необходимо зарегистрироваться для просмотра ссылки
Добрый день уважаемое сообщество. У меня платформа 7.7. Пытаюсь понять как в 1с7.7 реализирован принцип построения многомерных массивов. К сожалению не получаетсяю:-)
перем а[ы]


Работает, а вот
перем а[ы,в]

работать отказывается в чистую. подскажите пожалуйста как правильно строить многомерные массивы в 1с7.7
Заранее благодарен.

Наше одно из решений: но оно не является универсальным для всех ситуаций.
А[число]=1,,,N;
В[А[число]]=АгрегатноеЗначение;


Тут возможно правильное построение в том случае, когда один или несколько измерений массива является целочисленным элементом. В этом случае мы можем использовать N мерные массивы. Можно создать специфическое кодирование агрегатов, тогда все уровни массива возможно будет создать агрегатными... Сам додумался. :-) Если кому не понятно спрашивайте. Помогу с удовольствием. Но помните, минус этого алгоритма в том,что если вы не используете(Код товара, Код Контрагента, либо какие-то еще уникальные числа в 1с7.7), тогда вам придется в ручную создавать алгоритм кодирования Ваших Агрегатных Данных.
Acid
велосипед вы свой в 1С внедряете, уважаемый. не пытайтесь работать в 1С как с нормальным языком программирования. они сами смотрят в языки, и уже на базе чужих функций делают 1с-велосипед.
l2d808
Цитата(Acid @ 05.09.11, 11:31) необходимо зарегистрироваться для просмотра ссылки
велосипед вы свой в 1С внедряете, уважаемый. не пытайтесь работать в 1С как с нормальным языком программирования. они сами смотрят в языки, и уже на базе чужих функций делают 1с-велосипед.

Спасибо Вам за уточнение :-), Но без Єнтого велосипеда я не знал как слепить каркас для моей новой обработки. А так Вы правы, Энто чем-то похоже на извращенную систему криптографии на основе 1с вложенных данных :-).
g789
Для многомерного массива, наверно, удобнее использовать СписокЗначений (в качестве значений которого использовать СпискиЗначений и т.д. до любой размерности),

а так читаем ЖКК и видим:

Переменные могут объединяться в массивы.В данной реализации програм­мы предусмотрены только одномерные массивы.

Оператор объявления переменной
Перем
Объявление переменной в явном виде.

Синтаксис:

Перем <Имя_переменной> [[<Размерность>]] [Экспорт];

Параметры
<Имя_переменной>
Имя переменной.
[<Размерность>]
Необязательная числовая константа (записывает­ся в квадратных скобках), указывается только в том случае, если объявляется массив и должна представляться в виде положительного целого числа.
Экспорт
Необязательное ключевое слово Экспорт указы­вает, что данная переменная станет доступна для других модулей. Использование данного ключево­го слова имеет смысл только в глобальном про­граммном модуле.
Flexy
Цитата(g789 @ 05.09.11, 11:40) необходимо зарегистрироваться для просмотра ссылки
В данной реализации програм­мы предусмотрены только одномерные массивы.

Хм.Описание встроенного языка.Часть 2.Глава 29.Работа с Таблицей Значений
Таблица значений может использоваться и как простой двумерный массив (матрица)...
Vofka
Цитата
может использоваться

Так же как список значений может использоваться как одномерный массив. Но одно - не есть другое.
DartRomanius
Вывод:
7.7 не реализует механизм н-мерных массивов, а только 1-мерный (простите за ошибочное определение, вспомнил откуда перепутал, из Java). smile.gif
Для реализации н-мерных массивов в прямом понимании этого понятия следует использовать (как я писал выше) определение:
Перем А[НН * СлойН +НН-1 * СлойН-1 +.... + Н1] где слой Нх - соответственно размерность слоя.

Где-то как-то так.
alex1c
У меня все таки вопрос к автору темы: "в чем суть вашего задания?" потому как за 10 лет работы с 7.7 мне все удавалось с томощью ТЗ сделать и не обязательно тип делать "Справочник.Контрагенты" можно и неопределенный...
igmig65
Цитата
Перем А[НН * СлойН +НН-1 * СлойН-1 +.... + Н1] где слой Нх - соответственно размерность слоя.

Ничего неполучица, в [] должно быть целое число - размерность одномерного массива, тоесть сколько значений будет в этом массиве, соответствно оно не может быть нецелым. А вот задать размерность переменной, чтобы потом его определять в 7 неполучится, когдато пробовал, ничего невышло, как было сказано выше:
Цитата
[<Размерность>] Необязательная числовая константа (записывается в квадратных скобках), указывается только в том случае, если объявляется массив и должна представляться в виде положительного целого числа.


Цитата
надо построить массив по контрагентам закупки за период. Периоды могут изменятся, Контрагенты могут изменятся.

Может подойдет ТЗ, с определением к-ва колонок по к-ву дней в периоде, пример:
ТЗ = СоздатьОбъект("ТаблицаЗначений");
Для дд = НачДата по КонДата Цикл
      ТЗ.НоваяКолонка(,,,,""+дд);
КонецЦикла

Как то так.
Можно использовать запрос с 1 группировкой по контрагенту, а 2 "группировка День Все". Тогда 2 гркуппировка может формировать колонки по кол-ву дней в периоде. Туда попадут и нулевые значения функций.
Ну это так примеры, может для вашего случая они неподойдут (в каждой строке, разное кол-во колонок)
DartRomanius
Цитата(igmig65 @ 05.09.11, 22:10) необходимо зарегистрироваться для просмотра ссылки
Ничего неполучица, в [] должно быть целое число - размерность одномерного массива, тоесть сколько значений будет в этом массиве, соответствно оно не может быть нецелым. А вот задать размерность переменной, чтобы потом его определять в 7 неполучится, когдато пробовал, ничего невышло, как было сказано выше:



Видимо я непонятно написал:

что-то типа такого
 А[НомерСтроки * Длину Строки + НомерПозицииВСтроке]


3-х мерный где-то так

 А[НомерСлоя * КоличествоСтрок * ДлинуСтроки + НомерСтроки * ДлинуСтроки + НомерПозицииВСтроке]
l2d808
Цитата(l2d808 @ 05.09.11, 9:02) необходимо зарегистрироваться для просмотра ссылки
Добрый день уважаемое сообщество. У меня платформа 7.7. Пытаюсь понять как в 1с7.7 реализирован принцип построения многомерных массивов. К сожалению не получаетсяю:-)
перем а[ы]


Работает, а вот
перем а[ы,в]

работать отказывается в чистую. подскажите пожалуйста как правильно строить многомерные массивы в 1с7.7
Заранее благодарен.


За вчера получилось как-то так. Обработка Создает эксель файл в котором каждому контрагенту розписывается сума продаж за месяц. месяц автоматом добавляется в ТЗ. Получается в строках находится контрагент, а в столбиках - суммы продаж за месяц. Код, кому интересно, внизу. Извините за неадекватные переменные )


Процедура Test()         
    перем Месяц;  
    перем датаТекущая;      
    Сообщить(ТекущееВремя());
    ТЗ=СоздатьОбъект("ТаблицаЗначений");
    ТЗ.НоваяКолонка("контрагент");  
    дата11=НачМесяца(дата1);
    ДатаТекущая=дата11;
    Пока ДатаТекущая<=дата2 Цикл
        УказательМесяца=ДатаМесяц(ДатаТекущая);
        НазваниеМесяца(УказательМесяца,Месяц);
        Месяц=месяц+строка(ДатаГод(ДатаТекущая));
        ТЗ.НоваяКолонка(Месяц);
        ДатаТекущая=ДобавитьМесяц(ДатаТекущая,1);
    КонецЦикла;
    для НомКолонки=2 по ТЗ.КоличествоКолонок() цикл
    Конеццикла;
Номерстроки=0;
контр=СоздатьОбъект("Справочник.Контрагенты");
Док = СоздатьОбъект("Документ.РасходнаяНакладная");
контр.ВыбратьЭлементы();  
Пока контр.ПолучитьЭлемент()=1 Цикл
    Если контр.ЭтоГруппа()=0 Тогда
        Если (сокрЛП(контр.код)<>"00091") Тогда
            ТЗ.НоваяСтрока();
            ТЗ.контрагент=контр.ТекущийЭлемент();
            Номерстроки=номерстроки+1;
            ДатаТекущая=НачМесяца(дата1);    
            НомКолонки=2;
                Пока ДатаТекущая<=дата2 Цикл                                    
                    Док.ВыбратьДокументы(ДатаТекущая, ДобавитьМесяц(ДатаТекущая,1));
                    Пока Док.ПолучитьДокумент() = 1 Цикл
                        Если ТЗ.контрагент=Док.Контрагент Тогда
                            ЗначениеСуммы=ЗначениеСуммы+Док.Итог("СуммаСНДС");
                        КонецЕсли;
                    Конеццикла;
                    ТЗ.УстановитьЗначение(Номерстроки,НомКолонки,ЗначениеСуммы);
                    ДатаТекущая=ДобавитьМесяц(ДатаТекущая,1);
                    ЗначениеСуммы=0;
                    НомКолонки=НомКолонки+1;
                Конеццикла;
        КонецЕсли;
    КонецЕсли;
КонецЦикла;
Имя=КаталогИБ()+"\Zvit\Аналитика.xls";
Эксель=СоздатьОбъект("Excel.Application");
Книга = Эксель.WorkBooks.add(Имя);
Лист = Книга.WorkSheets("Лист1");
строкаЭксесь=1;
СтолбецЕксель=0;
для НомКолонки=1 по ТЗ.КоличествоКолонок() цикл
    ИмяШапки=ТЗ.ПолучитьПараметрыКолонки(НомКолонки);
    ИмяШапки=строка(ИмяШапки);
    Лист.Cells(1,НомКолонки).Value=ИмяШапки;
Конеццикла;
ТЗ.ВыбратьСтроки();                
Пока ТЗ.ПолучитьСтроку()=1 Цикл
        строкаЭксесь=строкаЭксесь+1;  
        Номерстроки=строкаЭксесь-1;
        для НомКолонки2=2 по ТЗ.КоличествоКолонок() цикл
            екккеку=екккеку+число(ТЗ.ПолучитьЗначение(Номерстроки,НомКолонки2));    
        конеццикла;
            сообщить(екккеку);
            для НомКолонки=1 по ТЗ.КоличествоКолонок() цикл
                СтолбецЕксель=НомКолонки;
                апапап=ТЗ.ПолучитьЗначение(Номерстроки,НомКолонки);
                ффаа1212=строка(апапап);
                Если ПустоеЗначение(ффаа1212)=0 Тогда
                    Лист.Cells(строкаЭксесь,СтолбецЕксель).Value=ффаа1212;
                КонецЕсли;    
            КонецЦикла;
        екккеку=0;
КонецЦикла;

//**************************
Эксель.ScreenUpdating = 1;  
Эксель.EnableEvents = 1;    
Эксель.Visible = 1;        
//**************************

КонецПроцедуры
//==========================
Процедура ПриОткрытии()
    Дата1="07,05,11";
    Дата2=Текущаядата();
    очиститьОкноСообщений();
КонецПроцедуры
alex040269
Цитата(l2d808 @ 05.09.11, 9:02) необходимо зарегистрироваться для просмотра ссылки
Добрый день уважаемое сообщество. У меня платформа 7.7. Пытаюсь понять как в 1с7.7 реализирован принцип построения многомерных массивов. К сожалению не получаетсяю:-)
перем а[ы]


Работает, а вот
перем а[ы,в]

работать отказывается в чистую. подскажите пожалуйста как правильно строить многомерные массивы в 1с7.7
Заранее благодарен.



а[x,y] = a[(x*(y-1)+y]
igmig65
Вот пример запроса, который вам выведет, то продажи по контрагентам в строках, и в колонках по месяцам, сдесь же пример использования одномерного массива.
    Перем Запрос, ТекстЗапроса, Таб,М[12];
    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса =
    "//{{ЗАПРОС(Сформировать)
    |Период с ВыбНачПериода по ВыбКонПериода;
    |ОбрабатыватьДокументы Проведенные;
    |Контр = Документ.РасходнаяНакладная.Контрагент;
    |Сум = Документ.РасходнаяНакладная.СуммаСНДС;
    |Функция СумСумма = Сумма(Сум);
    |Группировка Контр без групп;
    |Группировка Месяц все;
    |"//}}ЗАПРОС
;
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
        Возврат;
    КонецЕсли;

    Таб = СоздатьОбъект("Таблица");
    Таб.ИсходнаяТаблица("Таблица");
    //выводим шапку
    Таб.ВывестиСекцию("Шапка|Секция1");
    мм=0;
    Пока Запрос.Группировка(1) = 1 Цикл
        Пока Запрос.Группировка(2) = 1 Цикл
            Мес = Запрос.Месяц;
            Таб.ПрисоединитьСекцию("Шапка|Секция2");//вывод всех месяцев за период в шапке
            мм=мм+1;
            М[мм]=0;//для итогов по колонке
        КонецЦикла;
        Прервать;
    КонецЦикла;
    Таб.ПрисоединитьСекцию("Шапка|Секция3");//вывод итогов по строке в шапке
    
    //заново в запрос
    Запрос.ВНачалоВыборки();
    Пока Запрос.Группировка(1) = 1 Цикл
        Таб.ВывестиСекцию("Контр|Секция1");//выводим контрагента
        мс=0;
        Пока Запрос.Группировка(2) = 1 Цикл
            //здесь Запрос.СумСумма вернет сумму за месяц, присоединяем месяц
            Таб.ПрисоединитьСекцию("Контр|Секция2");
            //соберем итоги по месяцам в колонках
            мс=мс+1;
            М[мс]=М[мс]+Запрос.СумСумма;
        КонецЦикла;
        //здесь Запрос.СумСумма вернет сумму за весь период по контрагенту, присоединяем итог по строке
        Таб.ПрисоединитьСекцию("Контр|Секция3");
    КонецЦикла;

    // выведем итоги по месяцам и всего"
    Таб.ВывестиСекцию("Дно|Секция1");
    Для нн=1 По мм Цикл
        //сдесь М[нн] покажет итог по месяцу нн
        Таб.ПрисоединитьСекцию("Дно|Секция2");
    КонецЦикла;

    //здесь Запрос.СумСумма вернет всю сумму за весь период по всем контрагентам, выведем итог
    Таб.ПрисоединитьСекцию("Дно|Секция3");

    Таб.Показать();
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.