Добрый день уважаемое сообщество. У меня платформа 7.7. Пытаюсь понять как в 1с7.7 реализирован принцип построения многомерных массивов. К сожалению не получаетсяю:-)
перем а[ы]
перем а[ы,в]
Никогда вроде в 1С не встречал многомерных массивов . А почему вас ТЗ не устраивает?
Если не отшибает мне память то максимум 2-х мерные.
перем а[n][n];
ТЗ.ПерваяКолонка[М];
ТЗ.ВтораяКолонка[L];
ТЗ.ТретьяКолонка[N];
ТЗ - в принципе массив с оберткой, повторяюсь 2-х мерный массив за счет колонок.
Можно комбинировать кстати, получится уже не массив, а несколько более сложная структура - например ТЗ или СЗ с значениями типа ТЗ или СЗ.
ЗЫ: ТЗ - ТаблицаЗначений, СЗ - СписокЗначений
В 1С 7.7. аналог одномерного массива - список значений, а двумерного - таблица значений. Вроде так... А может Вам подойдут регистры? К ним можно обращаться с запросом.
ТЗ.ПерваяКолонка[М];
ТЗ.ВтораяКолонка[L];
ТЗ.ТретьяКолонка[N];
ТЗ можно вкладывать в ТЗ
перем а[ы]
перем а[ы,в]
А[число]=1,,,N;
В[А[число]]=АгрегатноеЗначение;
велосипед вы свой в 1С внедряете, уважаемый. не пытайтесь работать в 1С как с нормальным языком программирования. они сами смотрят в языки, и уже на базе чужих функций делают 1с-велосипед.
Для многомерного массива, наверно, удобнее использовать СписокЗначений (в качестве значений которого использовать СпискиЗначений и т.д. до любой размерности),
а так читаем ЖКК и видим:
Переменные могут объединяться в массивы.В данной реализации программы предусмотрены только одномерные массивы.
Оператор объявления переменной
Перем
Объявление переменной в явном виде.
Синтаксис:
Перем <Имя_переменной> [[<Размерность>]] [Экспорт];
Параметры
<Имя_переменной>
Имя переменной.
[<Размерность>]
Необязательная числовая константа (записывается в квадратных скобках), указывается только в том случае, если объявляется массив и должна представляться в виде положительного целого числа.
Экспорт
Необязательное ключевое слово Экспорт указывает, что данная переменная станет доступна для других модулей. Использование данного ключевого слова имеет смысл только в глобальном программном модуле.
Вывод:
7.7 не реализует механизм н-мерных массивов, а только 1-мерный (простите за ошибочное определение, вспомнил откуда перепутал, из Java).
Для реализации н-мерных массивов в прямом понимании этого понятия следует использовать (как я писал выше) определение:
Перем А[НН * СлойН +НН-1 * СлойН-1 +.... + Н1] где слой Нх - соответственно размерность слоя.
Где-то как-то так.
У меня все таки вопрос к автору темы: "в чем суть вашего задания?" потому как за 10 лет работы с 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=Текущаядата();
очиститьОкноСообщений();
КонецПроцедуры
перем а[ы]
перем а[ы,в]
а[x,y] = a[(x*(y-1)+y]
Вот пример запроса, который вам выведет, то продажи по контрагентам в строках, и в колонках по месяцам, сдесь же пример использования одномерного массива.
Перем Запрос, ТекстЗапроса, Таб,М[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");
Таб.Показать();
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua